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