我有一个复杂的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",
}
]
}
答案 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方法。