将外键添加到 Django 模型的 unicode 输出的最佳方法



我与一个模型城市有一个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秒。