Django rest framework:序列化程序不在响应数据中包含 id 字段

Django rest framework: serializer does not include id field in response data

我正在学习 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 发出 post 请求时,我会收到包含 serializer.data 的响应。但是,这不包含 'id' 字段(但它确实包含其他字段)。

使用的模型有一个自动生成的 id 字段。

我希望响应包含 id 字段,我该如何实现?

您正在通过 serializer.save() 创建事件实例。稍后您将 return 回复。这里 serializer.data 不会包括创建实例的 id 因为你调用了 def save(self, **kwargs) 函数,它只是 return 创建实例时使用的那些字段(意思是id 未使用,是自动生成的。

相反,您可以在使用 save() 时保存实例,如下所示: instance = serializer.save()

稍后将序列化器数据保存在一个变量中: response_data = serializer.data

现在添加 id 字段: response_data['id'] = instance.id

和returnresponse_data