使用django模型有效地获取数据

时间:2014-03-27 00:20:56

标签: python sql django django-models

我正在使用Django,我有一个关于模型的问题。我有2个模型,都与'ManyToMany'字段相关。

我想要一个查询来获取所有标签的数据,带有标签的最后一个图像以及带有标签的图像数量。我用过这段代码

        selargs = (
        'id', 
        'image__title',
        'image__smallImage', 
        'image__smallWidth', 
        'image__smallHeight',
        'name', 
        'nameCleaned')

    tags = Tag.objects.values(*selargs).annotate(
        imageCount=Count('image__id')).order_by('-image__date')

代码有效,但问题是sql语句,是...... pfff

SELECT "gallery_tag"."id", "gallery_image"."title", "gallery_image"."smallImage", "gallery_image"."smallWidth", "gallery_image"."smallHeight", "gallery_tag"."name", "gallery_tag"."nameCleaned", COUNT("gallery_image_tags"."image_id") AS "imageCount" 
FROM "gallery_tag" 
LEFT OUTER JOIN "gallery_image_tags" ON ( "gallery_tag"."id" = "gallery_image_tags"."tag_id" ) 
LEFT OUTER JOIN "gallery_image" ON ( "gallery_image_tags"."image_id" = "gallery_image"."id" ) 
GROUP BY "gallery_tag"."id", "gallery_image"."title", "gallery_image"."smallImage", "gallery_image"."smallWidth", "gallery_image"."smallHeight", "gallery_tag"."name", "gallery_tag"."nameCleaned", "gallery_image"."date" 
ORDER BY "gallery_image"."date"

我不知道这是否有效。有没有更好的办法?重要的是我在一次操作中获取数据,因为我在分页器中使用此查询来限制记录。可以在一个查询中执行此操作,还是更好地使用更多模型操作?

谢谢。

1 个答案:

答案 0 :(得分:3)

如果它没有被破坏,请不要修复它 - 这扩展到Python / Django中的优化。您可以花费一半的开发时间来优化代码的一小部分,但它仍然几乎没有什么区别。只需确保为您的应用程序使用适当的架构。

你会希望避免每次请求都进行大量查询,因为即使在小规模的应用程序中,差异也会很明显,如果它还没有让你疯狂。不要在for循环中构建查询集,并在适用的地方使用select_related()prefetch_related(),你会没事的。

您的情况下的查询绝对没问题。 LEFT OUTER JOIN在数据库引擎中得到了很好的优化,甚至可以在多个表中进行优化。分页通过限制数据库级别来防止大型结果集堵塞系统资源。

如果你发现某个请求一直花费相当多的时间,那么 - 只有这样 - 是时候分析你的应用程序并找出导致这种减速的确切原因 - 当然还有解决它的时间。