我在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无法做到的。它也支持GenericRelation
和GenericForeignKey
的预取,但是,它必须被限制为一组齐次的结果。例如,只有当查询被限制为一个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')