【发布时间】:2013-09-19 04:55:49
【问题描述】:
这看起来很简单,但我忽略了,但不管怎样。
我定义了一个模型,我想从模型中检索某些列(不是通过 QuerySet API/模型管理器),而是在模型类中。
例子:
class mymodel(models.Model):
col1 = ...
col2 = ...
col3 = ...
def __unicode__(self):
return '%s %s' % (self.col1, self.col3) # Notice I'm omitting col2.
在__unicode__ 类方法中,这至少算作2 个数据库查询。如何仅在 1 个 DB 查询中检索此类方法中的 col1 和 col3?好像应该这么简单,我觉得我在做一些愚蠢的事情。
更新:
根据反馈,我创建了一个测试模型、测试表格等……发现几位用户所说的都是正确的。但是,在我的 实际 代码中(使用多个表单),更改 __unicode__ 方法以返回一列连接值将 SQL 查询的数量从 601 更改为 34。我只更改了那一行.根据我的测试用例,可能发生了其他事情,但重申一下,我只更改了 unicode 方法,我得到的 DB 命中数量完全不同。
我不确定我的其他代码发生了什么,我将不得不尝试仔细查看它。同时这里是测试用例,证明你们是正确的:
# Models.py
class TestModelFK(models.Model):
col1 = models.CharField(max_length=8)
col2 = models.CharField(max_length=8)
col3 = models.CharField(max_length=8)
col4 = models.CharField(max_length=8)
allcols = models.CharField(max_length=32, blank=True, editable=False)
class Meta:
ordering = ('col1', 'col2')
def __unicode__(self):
return '%s %s %s %s' % (self.col1, self.col2, self.col3, self.col4)
def save(self, *args, **kwargs):
self.allcols = '%s %s %s %s' % (self.col1, self.col2, self.col3, self.col4)
super(TestModelFK, self).save()
class TestModel(models.Model):
quantity = models.IntegerField()
test_fk = models.ForeignKey(TestModelFK)
# forms.py
class TestModelForm(forms.ModelForm):
class Meta:
model = TestModel
# views.py
if request.method == 'GET':
post['TestModelFormSet'] = formset_factory(TestModelForm, extra=4)
【问题讨论】:
-
-1 因为前提完全是错误的。
-
你应该总是从
__unicode__返回一个unicode对象而不是一个字符串。