【问题标题】:Django REST Framework: How do you get the attributes from a serialized object?Django REST Framework:如何从序列化对象中获取属性?
【发布时间】:2020-09-27 18:23:38
【问题描述】:

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

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)

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

【问题讨论】:

  • 当前设置有什么问题?
  • 您想在调用serializer.save() 后的用户名查看已保存的用户名?还是想要原始的序列化数据?
  • 目前我无法弄清楚将什么传递给 get 函数的 obj 参数,或者它们是否有效。我在另一个 StackOverflow 问题中找到了实现的想法,但是我无法找到它的文档,并且陷入了如何继续调用 get 函数和获取本地 Python 字符串进行解析的问题。
  • @NavidZarepak 之后我想将用户名作为字符串获取(我无法删除这两行,否则会出错)

标签: django django-rest-framework


【解决方案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"])

另外,您不应该在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)

【讨论】:

  • 非常感谢这解决了我的问题!
猜你喜欢
  • 1970-01-01
  • 2013-02-02
  • 2015-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-24
  • 2017-07-12
相关资源
最近更新 更多