Tastypie:queryset = Model.objects.all()

时间:2013-11-23 21:47:05

标签: python django tastypie

我是Tastypie的新手。我看到tastypie使用queryset调用Django Models并显示数据。

我的问题是:如果Tastypie构建语句queryset = < DJANGO-MODEL >.objects.all(), 如果有1亿个对象会对数据库/后端造成巨大负担吗?

class RestaurentsResource(ModelResource):
    class Meta:
        queryset = Restaurents.objects.all()
        print queryset
        resource_name = 'restaurents'

3 个答案:

答案 0 :(得分:2)

Django查询集是惰性的:https://docs.djangoproject.com/en/dev/topics/db/queries/#querysets-are-lazy,因此在评估查询集之前不会执行任何数据库活动。

如果从REST界面返回所有1000个对象,则会在服务器上放置“巨大”负载,通常是分页:http://django-tastypie.readthedocs.org/en/latest/paginator.html或类似用于防止此情况。

如上面的示例类中那样在print上调用queryset,将强制进行评估。在生产代码中执行此操作是一个坏主意,尽管它在调试时可以很方便或作为学习工具。

答案 1 :(得分:1)

另外两个答案在QuerySets懒惰方面是正确的。但最重要的是,您在Meta类中指定的查询集是查询的基础。在Django中,QuerySet本质上是数据库查询的表示,但不执行。在执行查询之前,可以另外筛选QuerySet。

所以你可以拥有如下代码:

Restaurant.objects.all().filter(attribute1=something).filter(attribute2=somethindelse

Tastypie只使用您提供的QuerySet作为基础。在每次API访问时,它会在执行新查询之前向基础添加其他过滤器。 Tastypie还处理一些分页,因此您可以获得分页结果,因此不会返回每一行。

虽然使用all()非常正常,但如果您想限制Tastypie结果,此功能最有用。即,如果您的餐馆资源有“隐藏”字段,您可以设置:

class Meta:
    queryset = Restaurant.objects.filter(hidden=False)

API生成的所有查询都将使用给定的查询集作为基础,并且不会显示“hidden = True”的任何行。

答案 2 :(得分:0)

Django QuerySet对象被懒惰地评估,即 - 在真正需要时从db获取结果。在这种情况下,queryset = Restaurents.objects.all()会创建尚未评估的QuerySet

ModelResource的默认实现通常会强制在脱水时或分页时评估查询集。第一个需要传递模型对象,另一个需要对查询集进行切片。

自定义视图,授权或过滤方法可以提前强制进行评估。

也就是说,在完成所有过滤和分页之后,获取的结果列表比数据库中的总数据量要小得多。

相关问题