【问题标题】:django rest framework serializer - doesn't return empty list fielddjango rest 框架序列化器 - 不返回空列表字段
【发布时间】:2021-01-17 15:50:10
【问题描述】:

我有一个包含 JsonField 的模型的序列化程序。我希望始终返回特定字段,即使在 jsonField 中找不到它们也是如此。 调用“get”时 - 它确实返回序列化程序中的所有字段,但是当调用“更新”时,它返回具有更新字段和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=None
user_list=[]
manager=None

在响应中

但是当 user_list 不存在并且我正在更新其他字段(例如“days”)时,响应中将不存在“user_list”。 知道当空列表不存在时如何仍然返回它吗?

【问题讨论】:

  • 请展示您对获取和更新的看法
  • 我使用的是内置的mixins.UpdateModelMixin。没有改变它

标签: python django django-rest-framework


【解决方案1】:

据我了解,您使用的是部分更新。对于部分更新序列化程序,如果它未能检索到它,则从响应中跳过一个字段(可以在源代码here 中查看)。显然它无法检索,因为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)

【讨论】:

  • 确实我正在使用部分更新。将尝试并在此处更新。谢谢