我对django tastypie中Resource
和ModelResource
之间的区别感到有点困惑。
我有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/
检索报告的列表时,我想获取一个仅包含报告对象的name
和description
的json数组。
使用api/report/88387
检索单个报告时,我想获取一个包含模型中所有字段的json。
这可以在full_dehydrate
函数中实现,如上所述,但在我看来,必须有一个内置的解决方案。资源字段的use_in
属性似乎是一个很好的解决方案,但我不确定如何将其与ModelResource
一起使用。
github关于此问题存在一个老问题,我想知道是否有解决方案。
答案 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属性不匹配的字段的脱水。
希望这有帮助。