我正在使用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"
我不知道这是否有效。有没有更好的办法?重要的是我在一次操作中获取数据,因为我在分页器中使用此查询来限制记录。可以在一个查询中执行此操作,还是更好地使用更多模型操作?
谢谢。
答案 0 :(得分:3)
如果它没有被破坏,请不要修复它 - 这扩展到Python / Django中的优化。您可以花费一半的开发时间来优化代码的一小部分,但它仍然几乎没有什么区别。只需确保为您的应用程序使用适当的架构。
你会希望避免每次请求都进行大量查询,因为即使在小规模的应用程序中,差异也会很明显,如果它还没有让你疯狂。不要在for循环中构建查询集,并在适用的地方使用select_related()
和prefetch_related()
,你会没事的。
您的情况下的查询绝对没问题。 LEFT OUTER JOIN
在数据库引擎中得到了很好的优化,甚至可以在多个表中进行优化。分页通过限制数据库级别来防止大型结果集堵塞系统资源。
如果你发现某个请求一直花费相当多的时间,那么 - 只有这样 - 是时候分析你的应用程序并找出导致这种减速的确切原因 - 当然还有解决它的时间。