Django select_related和字段查找

时间:2011-12-07 14:17:42

标签: django django-models django-select-related

===的模型 ===

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

我编写了以下Queryset来获取模型字段(所有关系都是一对多)

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

对于 select_related 字段查找

,我有点困惑

1 个答案:

答案 0 :(得分:4)

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

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

SomeModel.objects.select_related('some_nullable_field')

一旦Django 1.4命中,您将可以访问名为prefetch_related的新方法,其工作方式类似于select_related,但支持ManyToManyFields并反转ForeignKey关系。