在单个查询中获取外键对象 - Django [英] get foreign key objects in a single query - Django

查看:328
本文介绍了在单个查询中获取外键对象 - Django的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆