0

===型号===

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 文档

返回一个 QuerySet,它将自动“遵循”外键关系,在执行查询时选择附加的相关对象数据。

select_related 仅限于单值关系 - 外键和一对一。

https://docs.djangoproject.com/en/dev/ref/models/querysets/#select-related

我已经编写了以下查询集来获取模型字段(所有关系都是一对多的)

myquery = Info.objects.select_related().filter(info_number__iexact = 123)
  • 我想从信息模型遍历上下模型
  • 我在模板中使用 select_related()获取A 类记录没有问题,但在我的情况下是否可以使用 select_related 获取所有模型字段(B 类、C、Cfurther、Infocategory、Extra)?
  • 如果不是,我是否必须创建新的查询集?或者什么 select_related() 会起作用?

我对select_related字段查找有点困惑

4

1 回答 1

4

您可以通过标准 Django API 尽可能深入地遍历所有关系。select_related在建立关系时没有做任何特别的事情;它仅允许您通过提前执行连接来减少数据库查询的数量(而不是在访问每个外键时查找它)。

但是,正如文档所述,select_related仅适用于外键和 OneToOneFields。它根本不适用于 ManyToManyFields。select_related此外,如果它是 OneToOneField ,您只能遵循反向关系。不支持反向外键。最后,默认情况下select_related仅遵循具有null=False. 如果它是一个 NULL-able 字段,您必须明确告诉select_related它遵循它:

SomeModel.objects.select_related('some_nullable_field')

一旦 Django 1.4 发布,您将可以访问一个名为的新方法prefetch_related,该方法的工作方式类似于select_related但支持 ManyToManyFields 和反向 ForeignKey 关系。

于 2011-12-07T15:00:59.553 回答