我使用投票应用程序(django-ratings,如果有所不同)使用django的GenericForeignKey,有一个ForeignKey用户,以及其他几个字段,如最新更改的日期。
我想获得一种内容类型的所有对象,即单个用户按最新更改日期的顺序进行投票。据我所知 - 所有信息都可以在一个表中找到(除了可以预取/缓存的content_type)。不幸的是,每当我请求content_object时,django仍会进行额外的查询。
所以问题是 - 我如何获得特定模型的给定模型的所有投票,相关对象以及最小数据库命中的订购?
编辑:现在我正在使用2个查询 - 首先选择所有投票,获取我需要的所有对象,通过.filter(pk__in = obj_ids)进行过滤,最后将它们填充到投票对象中。但似乎reverse generic relation可以帮助解决问题
答案 0 :(得分:0)
你签出了select_related()
吗?这可能有所帮助。
返回一个QuerySet,它将自动“跟随”外键关系,在执行查询时选择其他相关对象数据。这是一个性能提升器,它会导致(有时很多)更大的查询,但意味着以后使用外键关系不需要数据库查询。
https://docs.djangoproject.com/en/dev/ref/models/querysets/#select-related
答案 1 :(得分:0)
从the models.py of the django-ratings app开始,我认为您必须user.votes.filter(content_type__model=Model._meta.module_name).order_by("date_changed")
(假设您要过滤的模型是Model
)才能获得所有Vote
个对象。对于相关对象,遍历查询集,在每个项目上获取content_object
。恕我直言,这将导致最少的数据库查询。
答案 2 :(得分:0)
现在我们在GenericRelation上使用来自django 1.4的prefetch_related()。它仍然使用2个查询,但具有非常直观的界面。