我有几个模型:Review
,其中包含专辑评论字段,Record
,这是专辑名称等,以及Band
,这是乐队名称。Record
有一个外键反对Band
并且Review
有一个外键反对Record
。
在Review
我想为所有Record
s 显示一个下拉选择框的管理表单中。目前,用于的 unicode 方法Record
只是:
def __unicode__(self):
return self.record_name
这不是很有帮助,所以我将其更改为:
def __unicode__(self):
return self.band.band_name + ' - ' + self.record_name
这现在为每个(3000 左右)添加一个查询Record
,显然不好。
阅读此答案后,我尝试将其添加到我的模型管理员中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)