我正在学习 Django Rest 框架并创建了以下序列化器:
class EventCreateSerializer(serializers.ModelSerializer):
organiser = serializers.StringRelatedField(read_only=True, default=serializers.CurrentUserDefault())
class Meta:
model = Event
fields = ['id', 'name', 'description', 'date', 'organiser']
def save(self, **kwargs):
name = self.validated_data['name']
description = self.validated_data['description']
date = self.validated_data['date']
organiser = self.data['organiser']
organiser_account = Account.objects.get(username=organiser)
if not organiser_account:
raise serializers.ValidationError('Error setting the organiser field')
event = Event.objects.create(name=name, description=description, date=date, organiser=organiser_account)
event.save()
return event
注意“id”如何作为字段包含在内。
现在我有以下观点:
class EventCreateView(APIView):
permission_classes = [IsAuthenticated]
def post(self, request, format=None):
context = {
'request': self.request
}
serializer = EventCreateSerializer(data=request.data, context=context)
if serializer.is_valid():
serializer.save()
return Response(serializer.data,
status=status.HTTP_201_CREATED)
return Response({'fail': serializer.errors}, status=status.HTTP_400_BAD_REQUEST)
因此,当我向适当的 url 发出发布请求时,我会收到包含 serializer.data 的响应。但是,它不包含“id”字段(但它包含其他字段)。
使用的模型有一个自动生成的 id 字段。
我希望响应包含 id 字段,如何实现?
最佳答案
您正在通过执行 serializer.save()
创建一个 Event 实例。稍后您将返回响应。这里 serializer.data
不会包含创建的实例的 id
,因为您已经调用了 def save(self, **kwargs)
函数,它只返回创建实例时使用的字段(意味着 id
未使用且是自动生成的)。
相反,您可以在使用 save() 时保存实例,如下所示:
实例=serializer.save()
稍后将序列化器数据保存在变量中:
response_data=serializer.data
现在添加 id
字段:
response_data['id'] = instance.id
并返回response_data
关于python - Django休息框架: serializer does not include id field in response data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68481120/