我与一个模型城市有一个ManyToMany关系,它有一个带有State的外键字段。我正在尝试让Django管理字段小部件包含州名称,这样它就可以自动完成(因为我们的Django项目中有数千个城市)。
我想在城市__unicode__
中添加state.name
,如下所示:
class State(models.Model):
name = models.CharField(max_length=100)
class City(models.Model):
name = models.CharField(max_length=100)
state = models.ForeignKey(State)
def __unicode__(self):
return u'(%s) %d. %s' % (self.state.name, self.id, self.name)
class Person(models.Model):
cities_lived_in = models.ManyToManyField(City, null=True, blank=True)
但这会使加载时间增加一分钟以上:从4秒增加到1.6分钟。
我想知道是否有一种不那么冗长的方法可以将州名称添加到Django的manytomy小部件中。我知道我也可以改变模型形式,但我认为它会产生同样的结果,如果不是更糟的话,因为它会查找所有的城市,然后迭代它们,然后查找所有相关的州。
问题是我应该选择相关的模型,在我的情况下,我应该选择每个查询的相关模型。因此,我没有在使用City
模型的视图中执行select_related
,而是创建了一个自定义模型管理器,就像在这个So问题中一样:Django:强制选择相关?
因此,现在城市模型如下:
class WithState(models.Manager):
def get_query_set(self):
return super(WithState, self).get_query_set().select_related('state')
class City(models.Model):
name = models.CharField(max_length=100)
state = models.ForeignKey(State)
objects = WithState()
def __unicode__(self):
return u'(%s) %d. %s' % (self.state.name, self.id, self.name)
加载时间现在减少到3秒。