Django Tastypie添加自定义值(有条件)
我有一个复杂的Django模型,其中(1)有很多字段,(2)动态生成的数据没有存储在模型上 Comlex资源:Django Tastypie添加自定义值(有条件),django,rest,tastypie,denormalization,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()
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"]
{ "meta": {
"limit": 20,
"next": null,
"offset": 0,
"previous": null,
"total_count": 1
},
"objects": [
{"field_1": "foo", "field_2": "bar", ... , "field_n": "foobar"}
]
}
目前,我的复杂端点/m/api/v1/Complex/
成功返回模型上存储的数据
复杂响应:
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"]
{ "meta": {
"limit": 20,
"next": null,
"offset": 0,
"previous": null,
"total_count": 1
},
"objects": [
{"field_1": "foo", "field_2": "bar", ... , "field_n": "foobar"}
]
}
问题:
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"]
{ "meta": {
"limit": 20,
"next": null,
"offset": 0,
"previous": null,
"total_count": 1
},
"objects": [
{"field_1": "foo", "field_2": "bar", ... , "field_n": "foobar"}
]
}
我想做的是使用prepend\uURL
添加一个自定义端点,该端点将返回所有数据。这样,我就不必每次调用我的当前端点时都使用脱水
浪费性地添加数据,如下所示:
问题
如何创建一个prepend\u 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",
}
]
}
我想脱水机是为像你这样的箱子做的。添加查询集参数以确定Decreate是否应计算加法字段
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\u url
对我来说没有意义。因为这意味着再次重写Tastypie。这表明这里有些东西不安宁
如果您仍然想这样做,您应该查看dispatch
方法及其流程:
你必须在你的
prepend\u url
中以某种方式重写这个:方法。我认为脱水
是为像你这样的案例设计的。添加查询集参数以确定Decreate是否应计算加法字段
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\u url
对我来说没有意义。因为这意味着再次重写Tastypie。这表明这里有些东西不安宁
如果您仍然想这样做,您应该查看dispatch
方法及其流程:
你必须在你的
prepend\u url
中以某种方式重写这个:方法。我认为脱水
是为像你这样的案例设计的。添加查询集参数以确定Decreate是否应计算加法字段
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\u url
对我来说没有意义。因为这意味着再次重写Tastypie。这表明这里有些东西不安宁
如果您仍然想这样做,您应该查看dispatch
方法及其流程:
你必须在你的
prepend\u url
中以某种方式重写这个:方法。我认为脱水
是为像你这样的案例设计的。添加查询集参数以确定Decreate是否应计算加法字段
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\u url
对我来说没有意义。因为这意味着再次重写Tastypie。这表明这里有些东西不安宁
如果您仍然想这样做,您应该查看dispatch
方法及其流程:
你必须在你的
prepend\uURL
中重写这个:方法。Bingo,我知道一定有一个简单的方法可以做到这一点!宾果,我知道一定有一个简单的方法来做到这一点!宾果,我知道一定有一个简单的方法来做到这一点!宾果,我知道一定有一个简单的方法来做到这一点!