我有一个带有自定义json序列化程序的模型,它在转储到json之前执行一些处理。
现在,在获取单个obj时,我想使用模型中的自定义序列化程序来获取整个对象(使用上面提到的处理)。在获取列表时,我想使用默认的序列化程序来仅获取标题(仅渲染模型字段)。
我调查了三个选项
覆盖obj_get
def obj_get(self, bundle, **kwargs):
obj = ComplexModel.objects.get(pk=kwargs['pk'])
return obj.to_serializable()
我被抛出了
{"error": "The object LONG JSON DUMP has an empty attribute 'description' and doesn't allow a default or null value."}
不确定为什么会发生这种情况 - 字段description
可以为空,加上 - 为什么tastypie正在检查数据库中已有对象的验证,以及...在取出时?
使用dehydrate
def dehydrate(self, bundle):
return bundle.obj.to_serializable()
这很好但是循环在每个对象之前执行 - 所以我不知道我是在取一个列表还是一个单个对象。这里的结果是完整的serizliazed对象,无论是列表还是单个条目。
创建自定义序列化程序
class CustomComplexSerializer(Serializer):
def to_json(self, data, options=None):
if isinstance(data,ComplexModel):
data = data.to_serializable()
return super(CustomComplexSerializer,self).to_json(data)
这里的问题相同,当获取一个条目时,序列化程序接受data.obj
中的obj,当它获取一个列表时它接受一个dict(奇数......)。我可以检查bundle是否也是dict的一个实例 - 但是对ComplexModel
类型的测试感觉很尴尬。
那么实现自定义序列化以获取仅一个条目的最佳方法是什么?
答案 0 :(得分:0)
为了将来参考,我认为我找到了正确的方法来实现这一点,并使用full_dehydrate
。
def full_dehydrate(self, bundle, for_list=False):
if not for_list:
return bundle.obj.to_serializable()
return super(ReportResource,self).full_dehydrate(bundle,for_list)