Django REST Framework: как вы получаете атрибуты из сериализованного объекта?

#django #django-rest-framework

#django #django-rest-framework

Вопрос:

У меня есть метод POST, который будет использоваться для извлечения объекта JSON, который затем будет использоваться для извлечения first_name, last_name и username — хотя я не могу понять, как получить поля (т.Е. username) после его сериализации. Каков наилучший способ сделать это?

views.py

 @api_view(['POST'])
def createUser(request):
    # Making a Connection w/ MongoClient
    client = MongoClient('mongodb srv://test_user:0FP33TLJVWrjl8Vy@cluster0.5sacp.mongodb.net/sample_clubs?retryWrites=trueamp;w=majority')

    # Getting the Database
    db = client['sample_clubs']

    # Getting the Collection/Table
    collection = db['users']
    serializer = MyUserSerializer(data=request.data)

    # Gives bug if next 2 lines aren't here
    if serializer.is_valid():
        serializer.save()

    return Response(serializer.data)
  

serializers.py

 class MyUserSerializer(serializers.ModelSerializer):

    def get_first_name(self, obj):
        # obj is model instance
        return obj.first_name

    def get_last_name(self, obj):
        # obj is model instance
        return obj.last_name
    
    def get_user_name(self, obj):
        # obj is model instance
        return obj.user_name

    class Meta:
        model = MyUser
        fields = ['first_name', 'last_name', 'username']
        # fields = '__all__'
  

models.py

 class MyUser(models.Model):
    first_name = models.CharField(max_length=200) 
    last_name = models.CharField(max_length=200)
    username = models.CharField(max_length=200)

    def __str__(self):
        return self.username
  

Комментарии:

1. В чем проблема с текущей настройкой?

2. Вы хотите, чтобы имя пользователя после вызова serializer.save() было сохранено, чтобы увидеть, какое имя пользователя было сохранено? или вам нужны необработанные сериализованные данные?

3. В настоящее время я не могу понять, что передать в аргумент obj функций get или работают ли они. Я нашел идею для реализации в другом вопросе StackOverflow, однако я не смог найти документацию по нему и застрял на том, как продолжить вызов функций get и получить собственные строки Python для анализа.

4. @NavidZarepak После этого я хотел бы получить имя пользователя в виде строки (я не могу удалить эти 2 строки, иначе я получу сообщение об ошибке)

Ответ №1:

Метод сериализатора save в DRF вернет экземпляр, который был сохранен. Таким образом, вы можете просто вызвать любое его поле следующим образом:

 if serializer.is_valid():
    obj = serializer.save()
    print(obj.user_name)
  

Данные также будут доступны через проверенные данные сериализатора:

 if serializer.is_valid():
    print(serializer.validated_data.get('user_name')
  

Вы также можете использовать необработанный JSON, сгенерированный serializer:

 # note that serializer.data won't be available if 'is_valid()` returns False
print(serializer.data["user_name"])
  

Кроме того, вы не должны возвращаться serializer.data за пределы области is_valid видимости. Если is_valid() есть False , то никаких данных не будет, поэтому вы столкнетесь с ошибкой. Правильный способ был бы таким:

 if serializer.is_valid():
    serializer.save()
    return Response(serializer.data)
return Response(serializer.errors)
  

Если вы хотите вернуть только user_name ответ as:

 if serializer.is_valid():
    obj = serializer.save()
    return Response({"username": obj.user_name})
return Response(serializer.errors)
  

Комментарии:

1. Большое спасибо, это решило мою проблему!