Django中给定模型的GenericForeignKey查找

3 投票
3 回答
1504 浏览
提问于 2025-04-17 09:02

我在使用一个投票应用(如果提到django-ratings有帮助的话),这个应用用到了django的GenericForeignKey,里面有一个指向用户的外键,还有一些其他字段,比如最后修改的日期。

我想要获取某个用户投过票的所有对象,并按最后修改的日期排序。根据我的理解,所有的信息都可以在一个表里找到(除了content_type可以提前加载或缓存)。但遗憾的是,每次我请求content_object的时候,django都会额外发出一个查询。

所以我的问题是:如何才能以最少的数据库查询,获取某个模型上某个用户的所有投票,连同相关对象,并按照指定的顺序排列呢?

补充说明:现在我使用了两个查询,首先选择所有的投票,然后获取我需要的所有对象,通过.filter(pk__in=obj_ids)进行过滤,最后把它们填充到投票对象中。但似乎使用反向通用关系可以帮助解决这个问题。

3 个回答

0

从查看django-ratings应用的models.py文件来看,如果你想获取所有的Vote对象,你需要这样写:user.votes.filter(content_type__model=Model._meta.module_name).order_by("date_changed")(假设你要过滤的模型是Model)。对于相关的对象,你可以遍历查询结果,在每个项目上获取content_object。在我看来,这样做可以减少数据库的查询次数。

1

你有没有试过 select_related() 呢?这个可能会对你有帮助。

这个方法会返回一个查询集,它会自动“跟踪”外键关系,在执行查询时会选择额外的相关对象数据。这可以提高性能,虽然有时候查询会变得更大,但这样在后续使用外键关系时就不需要再去查询数据库了。

https://docs.djangoproject.com/en/dev/ref/models/querysets/#select-related

1

目前我们在使用Django 1.4中的prefetch_related(),它是用在通用关系上的。虽然它还是会发出两个查询,但使用起来非常简单易懂。

撰写回答