【问题标题】:Django rest framework: serializer does not include id field in response dataDjango rest 框架:序列化程序在响应数据中不包含 id 字段
【发布时间】:2021-07-22 07:54:24
【问题描述】:

我正在学习 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 字段,我该如何实现?

【问题讨论】:

    标签: python django serialization django-rest-framework


    【解决方案1】:

    您正在通过 serializer.save() 创建一个 Event 实例。稍后您将返回响应。这里serializer.data 不包括创建的实例的id,因为您调用了def save(self, **kwargs) 函数,它只返回创建实例时使用的那些字段(意思是id 未使用并且是自动生成的)。

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

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

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

    并返回response_data

    【讨论】:

      猜你喜欢
      • 2013-02-07
      • 2017-01-12
      • 2015-03-12
      • 1970-01-01
      • 2015-07-20
      • 2020-12-28
      • 1970-01-01
      • 2020-03-18
      • 2019-10-26
      相关资源
      最近更新 更多