我是Tastypie的新手。我看到tastypie使用queryset调用Django模型并显示数据。
我的问题是:如果Tastypie构建语句queryset = < DJANGO-MODEL >.objects.all(),如果有1亿个对象,它会给数据库/后端带来巨大的负载吗?
class RestaurentsResource(ModelResource):
class Meta:
queryset = Restaurents.objects.all()
print queryset
resource_name = 'restaurents'发布于 2013-11-24 05:56:38
Django查询集是lazy:https://docs.djangoproject.com/en/dev/topics/db/queries/#querysets-are-lazy,所以在对查询集求值之前,不会执行任何数据库活动。
如果你从REST接口返回所有1000个对象,那么你的服务器上会有一个“巨大的”负载,通常是分页:http://django-tastypie.readthedocs.org/en/latest/paginator.html或类似的东西用来防止这种情况发生。
在queryset上调用上面的example类中的print将强制求值。在生产代码中这样做不是一个好主意,尽管它在调试或作为学习工具时可能很方便。
发布于 2013-11-28 04:08:19
另外两个答案是正确的,因为QuerySets是懒惰的。但最重要的是,您在Meta类中指定的查询集是查询的基础。在Django中,QuerySet本质上是数据库查询的表示,但并未执行。在执行查询之前,可以额外过滤QuerySets。
所以你可能会有如下的代码:
Restaurant.objects.all().filter(attribute1=something).filter(attribute2=somethindelseTastypie只使用您提供的QuerySet作为基础。在每次API访问时,它都会在执行新查询之前向基础中添加额外的过滤器。Tastypie还处理一些分页,所以您可以获得分页的结果,这样就不会返回每一行。
虽然使用all()非常正常,但如果您想限制Tastypie结果,则此功能最有用。也就是说,如果你的餐厅资源有一个‘隐藏’字段,你可以设置:
class Meta:
queryset = Restaurant.objects.filter(hidden=False)API生成的所有查询都将使用给定的查询集作为基础,并且不会显示任何'hidden=True‘的行。
发布于 2013-11-24 05:56:48
Django QuerySet对象是延迟计算的,也就是说,结果是在真正需要的时候从数据库中获取的。在本例中,queryset = Restaurents.objects.all()创建了一个尚未评估QuerySet。
ModelResource的默认实现通常会强制在脱水时或分页时计算查询集。第一个需要传递模型对象,另一个需要对查询集进行切片。
自定义视图、授权或过滤方法可以提前强制执行评估。
也就是说,在进行了所有过滤和分页之后,提取的结果列表比数据库中的总数据量要小得多。
https://stackoverflow.com/questions/20168329
复制相似问题