【问题标题】:Best method to add foreign key to Django model's unicode output将外键添加到 Django 模型的 unicode 输出的最佳方法
【发布时间】:2014-05-30 09:04:16
【问题描述】:

我与一个模型 City 有一个 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 的 manytomany 小部件中。我知道我也可以更改模型形式,但我认为如果不是更糟的话,它会产生相同的结果,因为它会查找所有城市,然后迭代它们,然后查找所有相关的州。

【问题讨论】:

  • 我使用 Django 1.6,使用 Manager 和“withState”。但是没有它,当 Unicode(): 匹配查询中的外键字符串不存在时,我会收到错误消息。奇怪。

标签: python django many-to-many


【解决方案1】:

问题是我应该选择相关模型,在我的情况下,我应该选择每个查询的相关模型。因此,我没有在使用 City 模型的视图中执行 select_related,而是创建了一个自定义模型管理器,就像在这个 SO 问题中一样:Django: Force select related?

所以现在城市模型如下:

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 秒。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-23
    • 2010-12-21
    • 2014-12-13
    • 2015-02-21
    • 2020-07-18
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    相关资源
    最近更新 更多