我有一个 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/