这似乎是我忽略的一些简单的事情,但无论如何都是这样。
我定义了一个模型,我想从模型中检索某些列(不是通过 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 个 DB 查询。如何仅在 1 个数据库查询中检索此类方法中的 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)