Django 模型中的查询
Queries in Django Models
我有两个与 ForeignKey
相关的模型,我正在使用 select_related
从它们获取数据:
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
获取了数据。那我是不是做错了什么?
您在调用 select_related
时使用了模型的(小写)名称。相反,使用字段的名称,例如Adjacency.objects.select_related('fk_brainframe_parent')
.
我有两个与 ForeignKey
相关的模型,我正在使用 select_related
从它们获取数据:
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
获取了数据。那我是不是做错了什么?
您在调用 select_related
时使用了模型的(小写)名称。相反,使用字段的名称,例如Adjacency.objects.select_related('fk_brainframe_parent')
.