Django select_related 和字段查找
Posted
技术标签:
【中文标题】Django select_related 和字段查找【英文标题】:Django select_related and field lookup 【发布时间】:2012-01-15 01:11:54 【问题描述】:===模型===
class A(models.Model):
name= models.CharField(max_length=20, blank=False)
Class B(models.Model):
university = models.CharField(max_length=25, blank=False)
location = models.CharField(max_length=30, blank=False)
b_fk= models.ForeignKey(A)
Class C(models.Model):
studentclass = models.CharField(max_length=10, blank=False)
section = models.CharField(max_length= 10)
c_fk = models.ForeignKey(B)
class Cfurther(models.Model):
branch= Models.CharField(max_length=15, blank=Flase)
number = models.IntegerField()
cfur_fk = models.ForeignKey(C)
class Info(models.Model):
info_number = models.IntegerField()
info = models.CharField(max_length= 12, blank=Flase)
info_fk = models.ForeignKey(B, related_name= "info_set")
class Infocategory(models.Model):
find = models.CharField(max_length=15, blank=False)
cat_fk = models.ForeignKey(Info)
class Extra(models.Model):
extrainfo = models.CharField(max_length=30)
extra_fk = models.ForeignKey(Infocategory)
===查看===
Django 文档
返回一个自动“跟随”外键的查询集 关系,选择附加的相关对象数据,当它 执行它的查询。
select_related 仅限于单值关系 - 外键 并且是一对一的。
https://docs.djangoproject.com/en/dev/ref/models/querysets/#select-related
我已经编写了以下查询集来获取模型字段(所有关系都是一对多的)
myquery = Info.objects.select_related().filter(info_number__iexact = 123)
我想从 Info Model 向 Upper 和 lower 模型遍历
我在模板中使用 select_related() 获取 A 类 记录没有问题,但在我的案例中是否可以使用 select_related 获取所有模型字段(B 类, C, Cfurther, Infocategory, Extra)?
如果没有,我是否必须创建新的查询集?或者什么 select_related() 会起作用?
我对 select_related 字段查找有点困惑
【问题讨论】:
【参考方案1】:您可以通过标准 Django API 尽可能深入地遍历所有关系。 select_related
在建立关系时没有做任何特别的事情;它只是允许您通过提前执行连接来减少数据库查询的数量(而不是在访问每个外键时查找它)。
但是,正如文档所述,select_related
仅适用于外键和 OneToOneFields。它根本不适用于 ManyToManyFields。此外,如果它是 OneToOneField,您只能与 select_related
遵循反向关系。不支持反向外键。最后,默认情况下,select_related
仅跟随具有null=False
的字段。如果它是一个 NULL-able 字段,您必须明确告诉 select_related
跟随它:
SomeModel.objects.select_related('some_nullable_field')
一旦 Django 1.4 发布,您将可以访问一个名为 prefetch_related
的新方法,它的工作方式类似于 select_related
,但支持 ManyToManyFields 和反向 ForeignKey 关系。
【讨论】:
你只是重复了我已经提到的内容。我正在寻找解决方案而不是文档! 解决方案是文档。只要您不遵循反向外键或多对多,您可以select_related
任何您想要的。有什么问题?以上是关于Django select_related 和字段查找的主要内容,如果未能解决你的问题,请参考以下文章
Django:select_related到一个表vs表的字段
Django select_related 不显示所有字段,但原始 SQL 显示
带有指定字段的 Django select_related 打破了多个一对一关系
实例具体解释Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化
如何使用 select_related 获取 ManyToMany 字段值
转 实例具体解释DJANGO的 SELECT_RELATED 和 PREFETCH_RELATED 函数对 QUERYSET 查询的优化