django-tastypie自定义序列化,仅用于获取一个条目

时间:2014-01-16 17:47:27

标签: django json serialization tastypie

我有一个带有自定义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类型的测试感觉很尴尬。

那么实现自定义序列化以获取仅一个条目的最佳方法是什么?

1 个答案:

答案 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)