2011-12-07 61 views
0

=== 模式 ===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文档

返回一个将自动“跟随”外键012的QuerySet关系,当它执行其查询时选择该附加相关对象数据。

select_related仅限于单值关系 - 外键 和one-to-one。

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

我已经写了下面的查询集来获取模型场(所有的关系都是一个一对多)

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

我有点困惑关于select_related现场查找

回答

4

你,只要你想仅仅通过标准的Django API可以通过所有的关系,因为深遍历。 select_related在建立关系时没有做任何特别的事情;它仅允许您通过预先执行联接来减少数据库查询的数量(而不是在访问时查找每个外键)。

但是,作为文档状态,select_related只适用于外键和OneToOneFields。它根本不适用于ManyToManyFields。此外,如果它是OneToOneField,则只能跟随与select_related的反向关系。 Reverse ForeignKeys不受支持。最后,默认情况下,select_related仅在具有null=False的字段后面。如果它是一个为空的领域,你必须明确地告诉select_related遵循它:

SomeModel.objects.select_related('some_nullable_field') 

一旦Django的1.4安打,您将有机会获得一个叫prefetch_related新方法,它的工作原理是select_related但支持ManyToManyFields和反向ForeignKey的关系。

+0

你刚刚重复了我已经提到过的内容。我正在寻找解决方案,而不是文档! – thchand

+0

解决方案是文档。只要你没有遵循反向外键或多对多,你可以'select_related'任何你想要的。有什么问题? –