从Django的ForeignKey中获取QuerySet



我在Django中有两个模型:

class Category(models.Model)
....
class Article(models.Model)
category=models.ForeignKey(Category,on_delete=models.CASCADE,blank=True,null=True)

我想用一些过滤器获得一些类别,并在同一查询中获得该类别的所有文章。

我尝试用注释,但我不知道如何是正确的语法。

categories = Category.objets.filter(whatever='whatever').annotate('article')

您可以使用prefetch_related,而从Article模型中您将使用select_related

From django docs;

prefetch_related,对每个关系进行单独的查找,并在Python中进行"连接"。除了select_related支持的外键和一对一关系外,它还可以预取多对多和多对一对象,这是使用select_related无法做到的。它也支持GenericRelationGenericForeignKey的预取,但是,它必须被限制为一组齐次的结果。例如,只有当查询被限制为一个ContentType时,才支持预取被一个GenericForeignKey引用的对象。

这个例子就像你的模型,我有一个Team对象,它在Entry模型上有一个FK;

team = Team.objects.prefetch_related(
'entry_set'
).filter(id=team_id).first()

除非你在FK字段中设置了related_name,否则django会以模型名小写后跟_set的格式设置相关的集合。因此,您的Category将有一个article_set的相关文章。

正如我所说,select_realted将做相反的事情。以这个模型为例;


class SocialAccount(models.Model):
user = models.ForeignKey(allauth.app_settings.USER_MODEL, on_delete=models.CASCADE)

您可以通过执行;

在同一个查询中获得FK关系的相关对象。
social_account = SocialAccount.objects.select_related(
'user'
).get(uid=user_id)

在您的案例中,您只需要使用prefetch_related,并且由于您在反向外键查询中,您需要将_set添加到Article模型。

categories = Category.objets.prefetch_related('article_set').filter(whatever='whatever')

最新更新