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

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()

我有一个复杂的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"]
{   "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,我知道一定有一个简单的方法可以做到这一点!宾果,我知道一定有一个简单的方法来做到这一点!宾果,我知道一定有一个简单的方法来做到这一点!宾果,我知道一定有一个简单的方法来做到这一点!