Django REST框架: How do you get the attributes from a serialized object?

标签 django django-rest-framework

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

View .py

@api_view(['POST'])
def createUser(request):
    # Making a Connection w/ MongoClient
    client = MongoClient('mongodb+srv://test_user:<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="15255345262641595f4342677f792d436c5576796066617067253b20667476653b787a7b727a71773b7b7061" rel="noreferrer noopener nofollow">[email protected]</a>/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)

序列化器.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__'

模型.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

最佳答案

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"])

此外,您不应在 is_valid 范围之外返回 serializer.data。如果 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)

关于Django REST框架: How do you get the attributes from a serialized object?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64091868/

相关文章:

django - 重用 Django Rest Framework 嵌套序列化器中的现有对象

python - ALLOWED_HOSTS 和 Django

Django StaticFiles APP 和 Wsgi

javascript - 我正在使用两个 onready() 处理程序创建然后隐藏一个 jquery 时间条目,它会导致 IE7 和 Firefox 中出现严重错误

django - 如何在Kubernetes中实际设置django静态文件的样式?

django - 从另一个 View 调用 ViewSet 方法

django - 按交替值排序查询集

python - Django登录部分

python-3.x - 如何在没有任何模型的情况下使用带有 Django Rest Framework 的 View 集使用 post 方法在 Swagger UI 中传递参数?

django - 内部和外部 API 的单独文档 (drf_yasg)