为了账号安全,请及时绑定邮箱和手机立即绑定

djangorest框架序列化器-不返回空列表字段

djangorest框架序列化器-不返回空列表字段

胡说叔叔 2023-09-26 16:49:38
我有一个包含 JsonField 的模型的序列化器。我希望始终返回特定字段,即使在 jsonField 中找不到它们。当调用“get”时,它确实返回序列化器中的所有字段,但是当调用“update”时,它返回带有更新字段 和 的实例,allow_null=True因此default=list未更新的字段将不会在响应中返回。问题是我如何仍然返回所有序列化器字段作为响应,包括字段default=list,即使它们没有更新并且不存在?这是序列化器 -class ObjectsListSerializer(serializers.Serializer):    days = serializers.IntegerField(allow_null=True, source='objects_list.days')    user_list = serializers.ListField(child=serializers.CharField(), default=list, allow_empty=True, required=False, source='objects_list.user_list')    manager = serializers.CharField(allow_null=True, source='objects_list.manager')    def update(instance, validated_data):                if 'objects_list' in validated_data:        for attr, value in validated_data['objects_list'].items():            instance.objects_list[attr] = value        instance.save()        return instance如前所述,当发送“get”请求时,即使“objects_list”为空,我也会得到days=Noneuser_list=[]manager=None在回应中但是,当 user_list 不存在并且我正在更新其他字段(例如“天”)时,响应中将不存在“user_list”。知道当空列表不存在时如何仍然返回空列表吗?
查看完整描述

1 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

据我了解,您正在使用部分更新。对于部分更新序列化程序,如果无法检索该字段,则从响应中跳过该字段。显然它无法检索,因为objects_listNone,所以objects_list.user_list引发AttributeError

因此,为了使其按您希望的方式工作,您应该在视图中手动返回完全序列化的数据:

def partial_update(self, request, pk=None):

  partial_serializer = self.get_serializer(self.get_object(), data=request.data, partial=True)

  partial_serializer.is_valid(raise_exception=True)

  instance = partial_serializer.save()

  # Saved, now return all attributes (not using partial=True here):

  return Response(self.get_serializer(instance).data)


查看完整回答
反对 回复 2023-09-26
  • 1 回答
  • 0 关注
  • 76 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信