使用prefetch_related和ModelResources进行Tastypie优化

时间:2013-07-03 02:33:36

标签: tastypie

我有以下ModelResource:

class DivisionsResource(ModelResource):
    plants = fields.ToManyField('plants.api.resources.PlantsResource', 'plant_set', full = True)

    class Meta:
        queryset = Division.objects.all().prefetch_related('plant_set')
        allowed_method = ['get']
        filtering = {
                    "name": ('istartswith')
                }


class PlantsResource(ModelResource):
    picture = fields.ToOneField('files.api.resources.PlantPictureResource', 'picture', full=True)
    production_lines = fields.ToManyField('production_lines.api.resources.ProductionLinesResource','productionline_set', full=True, null=True)

    class Meta:
        queryset = Plant.objects.select_related('picture').all().prefetch_related('productionline_set')
        allowed_methods = ['get']

但是,如果我调用“divisions”资源并查看SQL查询,则不会在 Plants Resource 中执行prefetch_related和select_related。它会选择每个工厂的productionline_set和图片,而不是在 SQL查询中。这是为什么?

然而,我发现我可以做这样的事情:

queryset = Division.objects.all().prefetch_related('plant_set', 'plant_set__picture','plant_set__productionline_set')

我必须在分部模型中确实这样做吗?如果从父母那里调用“prefetch”和“select_related”,那将会超长。

1 个答案:

答案 0 :(得分:0)

您可以使用扩展程序django-tastypie-specified-fields(我是作者)。您可以指定要提取的字段,它会自动为您添加onlyselect_related

但是它还不支持m2m关系和prefetch_related。虽然这应该是相当微不足道的,尤其是对于一个层面的深度。如果您需要,请告诉我,我会添加它。