Django REST框架:如何从序列化对象中获取属性?

时间:2020-09-27 18:23:38

标签: django django-rest-framework

我有一个POST方法,该方法将用于检索JSON对象,然后将其用于检索first_name,last_name和用户名-尽管我不知道如何获取字段(即用户名)序列化后。最好的方法是什么?

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=true&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 个答案:

答案 0 :(得分:1)

DRF中序列化器的save方法将返回已保存的实例。因此,您可以像这样简单地调用其任何字段:

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

该数据还将通过序列化程序的验证数据提供:

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

您还可以使用由序列化程序生成的原始JSON:

# 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作为响应:

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