在单个查询中获取外键对象 - Django [英] get foreign key objects in a single query - Django
问题描述
class ModelA(models.Model):
name = models.CharField(max_length = 255)
description = models.CharField(max_length = 255)
created_by = models.ForeignKey(User)
class ModelB(models.Model)
category = models.CharField(max_length = 255)
modela_link = models.ForeignKey(ModelA,'modelb_link')
functions = models.CharField(max_length = 255)
created_by =模型.ForeignKey(用户)
说ModelA有100条记录,所有这些记录可能有也可能没有链接到ModelB
现在说我想得到每个ModelA记录的列表以及来自ModelB的数据
我会这样做:
list_a = ModelA.objects.all()
然后为了获取ModelB的数据,我将不得不做
对于我在list_a:
i.additional_data = i.modelb_link.all()
但是,这会对i的每个实例运行一个查询。从而使101个查询运行。
有没有任何方法可以在一个查询中运行这一切。或至少少于101个查询。
我尝试放入 ModelA.objects.select_related()。all()
但这没有似乎有任何效果。
谢谢
As Ofri说, select_related
只适用于前向关系,而不是反向关系。
没有内置的方法来自动跟踪Django中的反向关系,但请参阅我的博客文章,以便有效地做到这一点。基本思想是一次获取每个项目的所有相关对象,然后将它们与他们的相关项目手工关联 - 所以您可以在2个查询而不是n + 1中执行此操作。
I have 2 models in my django code:
class ModelA(models.Model):
name = models.CharField(max_length=255)
description = models.CharField(max_length=255)
created_by = models.ForeignKey(User)
class ModelB(models.Model):
category = models.CharField(max_length=255)
modela_link = models.ForeignKey(ModelA, 'modelb_link')
functions = models.CharField(max_length=255)
created_by = models.ForeignKey(User)
Say ModelA has 100 records, all of which may or may not have links to ModelB
Now say I want to get a list of every ModelA record along with the data from ModelB
I would do:
list_a = ModelA.objects.all()
Then to get the data for ModelB I would have to do
for i in list_a:
i.additional_data = i.modelb_link.all()
However this runs a query on every instance of i. Thus making 101 queries to run.
Is there any way of running this all in just 1 query. Or at least less than the 101 queries.
I've tried putting in ModelA.objects.select_related().all()
but this didn't seem to have any effect.
Thanks
As Ofri says, select_related
only works on forwards relations, not reverse ones.
There's no built-in way to automatically follow reverse relations in Django, but see my blog post for a technique to do it reasonably efficiently. The basic idea is to get all the related objects for every item at once, then associate them manually with their related item - so you can do it in 2 queries rather than n+1.
这篇关于在单个查询中获取外键对象 - Django的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!