python - django rest 框架序列化器 - 不返回空列表字段
问题描述
我有一个包含 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=None
user_list=[]
manager=None
在回应中
但是当 user_list 不存在并且我正在更新其他字段(例如“days”)时,响应中将不存在“user_list”。知道当它不存在时我如何仍然返回空列表吗?
解决方案
据我了解,您正在使用部分更新。对于部分更新序列化程序,如果它未能检索到它,则从响应中跳过一个字段(可以在源代码中查看)。显然它无法检索,因为objects_list
是None
,所以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)
推荐阅读
- sql - 计算相邻行之间的时间差
- database - 数据库 - 软删除或分离的日志表
- python - 如何使用 DJango 从 HTML 按钮调用特定的 python 脚本/程序
- javascript - 我的引导视图模式上出现的单词“数组”
- ios - 使用 NSCoding 使用更多数组数据更新 iOS 存储数据
- wordpress - 301 重定向,对路径和文件名进行重大更改
- java - Spring boot:由于输入结束,没有要映射的内容
- ruby - 厨师创建具有公钥访问权限的用户帐户
- c# - 根据文本字段是否 =“0”过滤 Tablix
- c# - 识别来自不同键盘的条目 if(e.Keycode)