2015-03-19 150 views
0

我有ForeignKey相关的两款车型,我使用select_related从他们那里获取数据:查询在Django模型

class Translation(models.Model): 
    pk_translation = UUIDField(auto=True, primary_key=True, serialize=True, hyphenate=True) 
    en = models.TextField('English', blank = True, null = True) 
    fr = models.TextField('French', blank = True, null = True) 
    de = models.TextField('German', blank = True, null = True) 
    it = models.TextField('Italian', blank = True, null = True) 
    creationLanguage = models.CharField(max_length=3, choices=s.LANGUAGES, blank = True, null = True) 

    def __str__(self):    # __unicode__ on Python 2 
     if self.creationLanguage is not None: 
      return getattr(self, str(self.creationLanguage)) 
     else: 
      return str(self.en) 

class Brainframe(models.Model): 
    pk_brainframe = UUIDField(auto=True, primary_key=True, serialize=True, hyphenate=True) 
    title = models.OneToOneField(Translation, related_name='Brainframe.title') 
    description = models.OneToOneField(Translation, related_name='Brainframe.description') 

    def __str__(self):    # __unicode__ on Python 2 
     return self.title.__str__() 

class Adjacency(models.Model): 
    pk_adjacency = UUIDField(auto=True, primary_key=True, hyphenate=True) 
    fk_brainframe_parent = models.ForeignKey('Brainframe', related_name='Adjacency.parent') 
    fk_brainframe_child = models.ForeignKey('Brainframe', related_name='Adjacency.child') 

    def __str__(self):    # __unicode__ on Python 2 
     return self.fk_brainframe_child.__str__() 

我的查询如下:现在

root_id = Brainframe.objects.select_related('translation').get(pk=brainframe_id) 

brainframes = Adjacency.objects.select_related('brainframe').filter(fk_brainframe_parent=root_id) 

for brainframe in brainframes: 
     print brainframe.fk_brainframe_parent #it hit the database 

,如解释select_related文档,它立即获取相关对象,并且不会再次访问数据库。但在我的情况下,每次点击数据库brainframe.fk_brainframe_parent。但它不应该像我使用select_related获取数据一样。那么我在这里做错了什么?

回答

1

您在拨打select_related时正在使用模型的(小写)名称。相反,使用该字段的名称,例如Adjacency.objects.select_related('fk_brainframe_parent')