Python Django:POST请求时需要此字段
我正在尝试创建一个序列化程序,它输出报告和用户信息。 我的任务由此序列化程序完成:Python Django:POST请求时需要此字段,python,django,django-rest-framework,Python,Django,Django Rest Framework,我正在尝试创建一个序列化程序,它输出报告和用户信息。 我的任务由此序列化程序完成: class ReportSerializer(serializers.ModelSerializer): latitude = serializers.CharField() longitude = serializers.CharField() city = serializers.IntegerField() type = serializers.IntegerField()
class ReportSerializer(serializers.ModelSerializer):
latitude = serializers.CharField()
longitude = serializers.CharField()
city = serializers.IntegerField()
type = serializers.IntegerField()
# We have created a field which returns a value from get_marker_icon_url
marker_icon = serializers.SerializerMethodField('get_marker_icon_url')
status_str = serializers.SerializerMethodField('convert_status_toStr')
type_str = serializers.SerializerMethodField('convert_type_toStr')
status_color = serializers.SerializerMethodField('get_status_color')
likes = serializers.SerializerMethodField('random_likes')
user = ReportUserSerializer()
class Meta:
model = Reports
fields = [
'user',
'id',
'type',
'city',
'latitude',
'longitude',
'likes',
'type_str',
'status_str',
'status_color',
'attached_message',
'marker_icon',
'attached_photo',
'date_created'
]
...
使用此代码,我的序列化程序将返回如下响应:
[
{
"user": {
"id": 1,
"username": "3nematix",
"profile_pic": "http://192.168.0.29:8000/frontend/static/frontend/images/reports/user_profile_pic.jpg",
"verified": false
},
"id": 1,
"type": 9,
"city": 0,
"latitude": "6.5123333",
"longitude": "51.512586",
"likes": 27,
"type_str": "OTHER",
"status_str": "PENDING",
"status_color": "orange",
"attached_message": "test",
"marker_icon": "OTHER",
"attached_photo": "http://192.168.0.29:8000/frontend/static/frontend/images/reports/user_profile_pic_VRjIYTs.jpg",
"date_created": "2020-10-21T23:19:06.899302Z"
},
......
]
这正是我所需要的,但问题是,当我试图通过POST请求创建新对象时,我得到以下响应:
{
"user": [
"This field is required."
]
}
如果我要从Meta中删除
'user'
,并从ReportSerializer
类中删除user=ReportUserSerializer()
,那么我可以创建一个新对象,但是当我希望获得报告时,我需要使用用户信息再次添加这两个对象,如何修复它?在调用save之前,您需要自己填写用户字段。
以下是简单的方法:
class YourView(generics.ListCreateAPIView):
...
def perform_create(self, serializer):
serializer.save(user=self.request.user)
或者稍有不同:
class YourView(generics.ListCreateAPIView):
...
def perform_create(self, serializer):
serializer.validated_data['user'] = self.request.user
return super().perform_create(serializer)