Tastypie添加自定义值(有条件地)

时间:2014-04-17 21:58:54

标签: django rest tastypie denormalization

我有一个复杂的Django模型,其中包含(1)很多字段和(2)此模型的动态生成数据,这些数据未存储在模型中。

Comlex资源:

class ComplexResource(resource):
    class Meta:
        allowed_methods = ('get','put','post','delete','patch')
        queryset = Complex.objects.all()
        serializer = CustomSerializer()
        authorization = Authorization()
        authentication = Authentication()
        always_return_data  = True
        filtering = { "field_1" : ALL, "field_2" : ALL, "field_N" : ALL }
        ordering = ["field_1", "field_2", "field_n"]

目前,我的复杂端点/m/api/v1/complex/成功返回模型上的STORED数据。

复杂响应:

{   "meta": {
        "limit": 20,
        "next": null,
        "offset": 0,
        "previous": null,
        "total_count": 1
    },
    "objects": [
        {"field_1": "foo", "field_2": "bar", ... , "field_n": "foobar"}
    ]
}

问题:

我想要做的是使用prepend_urls添加一个返回所有数据的自定义端点。这样我每次调用当前端点时都不必使用dehydrate浪费地添加数据,这可以在这里看到:

http://django-tastypie.readthedocs.org/en/latest/cookbook.html#adding-custom-values

问题

如何创建将prepend_url注入资源的其他数据?还是有更好的设计模式来解决这个问题?

带有所有数据的复杂响应:/ m / api / v1 / complex / all /

{   "meta": {
        "limit": 20,
        "next": null,
        "offset": 0,
        "previous": null,
        "total_count": 1
    },
    "objects": [
        {"field_1": "foo",
         "field_2": "bar",
          .
          .
          . 
         "field_n": "foobar",
         "advanced_field_1 : "a1",
         "advanced_field_2 : "a2",
          . 
          . 
          . 
         "advanced_field_n : "an",
        }
    ]
}

1 个答案:

答案 0 :(得分:3)

我认为dehydrate是针对像你这样的案件制作的。添加查询集参数以确定脱水是否应计算加法字段。

def dehydrate(self, bundle):
    if bundle.request.GET.get('attach_dynamic_fields'):
        bundle.data['my_dynamic_field_1'] = make_dynamic_field(1)
        bundle.data['my_dynamic_field_2'] = make_dynamic_field(2)
    return bundle

然后在需要时使用:

/api/v1/complex/ # Gives all, no dynamic fields attached

/api/v1/complex/1/ # Gives one, no dynamic fields attached

/api/v1/complex/?attach_dynamic_fields=1 # Gives all, with dynamic fields

/api/v1/complex/1/?attach_dynamic_fields=1 # Gives one, with dynamic fields

创建prepend_url对我来说没有意义。因为这意味着再次重写Tastypie。这表明这里的某些东西不是RESTful。

如果你想要这样做,你应该看看dispatch方法及其流程: Flow through request / response cycle

您必须以某种方式在prepend_url中重写此dispatch方法。