python - Django休息框架: serializer does not include id field in response data

标签 python django serialization django-rest-framework

我正在学习 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/

相关文章:

django - 批量存储和提供静态内容的最佳方式

java - 通过套接字多次发送序列化对象

c# - 为可序列化模型对象编写事件处理程序的正确方法是什么?

java - XML 的注解 @JsonDeserialize 的等价物

python - "Zipping"按列值的两个数据帧

python - 如何正确使用__setattr__,避免无限递归

python - 异常值 :failed to find libmagic. 检查您在 Windows 7 中的安装

python - Firebase python,访问用户数据

python - 按 T​​rue 序列分组

python - 如何在 Python 中打印到 stderr?