【问题标题】:django-tastypie custom serialization for fetching only one entrydjango-tastypie 自定义序列化只获取一个条目
【发布时间】:2014-02-05 19:03:21
【问题描述】:

我有一个带有自定义 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 字段可以为空,另外——为什么 sweetpie 正在检查数据库中已有对象的验证,并且...在获取时??

使用dehydrate

 def dehydrate(self, bundle):
            return bundle.obj.to_serializable()

这很好,但循环是在每个对象之前执行的——所以我不知道我是在获取列表还是单个对象。这里的结果是完整的序列化对象,无论是列表还是单个条目。

创建自定义序列化程序

  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,当它获取一个列表时,它接受一个字典(奇数...)。我也可以检查 bundle 是否是 dict 的一个实例——但是测试 ComplexModel 的类型感觉很尴尬。

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

【问题讨论】:

    标签: django json serialization tastypie


    【解决方案1】:

    仅供参考,我想我找到了正确的方法,那就是使用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)
    

    【讨论】:

      猜你喜欢
      • 2013-03-09
      • 1970-01-01
      • 2016-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 2011-03-04
      • 1970-01-01
      相关资源
      最近更新 更多