【发布时间】:2013-01-10 09:56:33
【问题描述】:
我有几个模型:Review,其中包含专辑评论字段,Record,这是专辑名称等,Band,这是乐队名称。 Record 有一个针对 Band 的外键,Review 有一个针对 Record 的外键。
在Review 的管理表单中,我想为所有Records 显示一个下拉选择框。目前,Record 的 unicode 方法只是:
def __unicode__(self):
return self.record_name
这不是很有帮助,所以我将其更改为:
def __unicode__(self):
return self.band.band_name + ' - ' + self.record_name
这现在为每个Record(3000 左右)添加一个查询,显然不好。
阅读this answer,我尝试将此添加到我的模型管理员Record:
def queryset(self, request):
return super(RecordAdmin, self).queryset(request).select_related('band')
不过,这并没有什么不同。
是否可以在模型的 __unicode__ 表示中使用外键字段而不会引发 n 平方查询?
更新:这是模型(删除了不相关的字段):
class Review(models.Model):
def __unicode__(self):
# this is used in other places where we show review titles
return self.record.band.band_name + ' - ' + self.record.record_name
record = models.ForeignKey('Record')
review_text = models.TextField()
class Record(models.Model):
def __unicode__(self):
# this generates a billion queries
#return self.record_name
return self.band.band_name + ' - ' + self.record_name
def band_and_title(self):
return self.band.band_name + ' - ' + self.record_name
band = models.ForeignKey('Band')
label = models.ForeignKey('Label')
record_name = models.CharField(max_length=175)
class Band(models.Model):
def __unicode__(self):
return self.band_name
band_name = models.CharField(max_length=100)
【问题讨论】:
-
您是否有更多信息:Django 版本等。我在几个地方和项目中几乎完全使用此代码,并取得了巨大成功。
-
当然:本地版本 1.4.1(尽管服务器使用的是 1.2.3)。我把它放在正确的模型上吗?从技术上讲,我正在编辑
Review而不是Record,但我也在那里尝试过,没有发现任何区别。
标签: django