在django tastypie中使用带有ModelResource的use_in字段选项

时间:2014-03-17 09:03:48

标签: django tastypie

我对django tastypie中ResourceModelResource之间的区别感到有点困惑。

我有Resource

class ReportResource(ModelResource):
  class Meta:
     queryset = Report.objects.filter(deleted__isnull=True)
     resource_name = 'report'
     object_class = Report

检索列表时,不应提取字段report_data ....

是否可以在ModelResource中使用use_in选项?

另一种方法是使用full_dehydrate

def full_dehydrate(self, bundle, for_list=False):   

    if for_list:
        # List view
        # Remove unnecessary fields from the bundle 

    # Detail view
    return super(ReportResource,self).full_dehydrate(bundle,for_list)

但是删除脱水中的字段可能会导致性能不佳,因为已经从数据库中提取了所有字段。

修改

我会进一步解释我想要实现的目标

使用api/report/检索报告的列表时,我想获取一个仅包含报告对象的namedescription的json数组。

使用api/report/88387检索单个报告时,我想获取一个包含模型中所有字段的json。

这可以在full_dehydrate函数中实现,如上所述,但在我看来,必须有一个内置的解决方案。资源字段的use_in属性似乎是一个很好的解决方案,但我不确定如何将其与ModelResource一起使用。

github关于此问题存在一个老问题,我想知道是否有解决方案。

2 个答案:

答案 0 :(得分:4)

在ReportResource中对__init__函数进行子类化,并在那里设置use_in标记,现在您的字段已填充:

def __init__(self, *args, **kwargs):
    # Call the object's parent, which will set up and populate
    # the Resource fields from the queryset provided
    super(ReportResource, self).__init__(*args, **kwargs)
    # Now loop through the fields of the resource, and when we
    # find the one we only want to be shown in the detail view,
    # set its use_in attr appropriately
    for field_name, field_object in self.fields.items():
        if field_name == 'report_data':
            field_object.use_in = 'detail'

(通常情况下,你可以在一个单独的类中混合使用它,也许它可以从Meta中的变量读取你想要的列表,但这应该按照你的要求进行。)

self.fields.items()中使用use_in检查资源的full_dehydrate方法,使用{{1}}进行相同类型的循环,如source code of resources.py所示。

答案 1 :(得分:1)

根据我的理解,你可以在ModelResource中使用use_in。

ModelResource是Tastypie的“contrib”资源。

ModelResource在以下方法中调用Resource的full_dehydrate方法:

[get_list,get_detail,post_list,put_list,put_detail,patch_list,patch_detail和get_multiple]

在每个_list方法中,使用for_list = True调用full_dehydrate方法,并且在每个_detail方法中,不使用for_list调用full_dehydrate方法(for_list = False是默认值)

在资源中定义字段时,只需为需要特别注意的每个字段添加use_in属性(“all”,“detail”,“list”),默认为“all”。

此属性的用法在full_dehydrate方法中。 它会跳过与for_list参数旁边的use_in属性不匹配的字段的脱水。

希望这有帮助。