我正在尝试从查询集中检索不同的.values()
,但是返回正确的值时遇到了问题。如何编写我的model
,以便可以使用.values()
方法检索属性?
我试图更改模型的__str__
方法以返回字典,但这不起作用,或者我做错了。
class Settings(models.Model):
bb_bonus_qualify = models.CharField(max_length=16, default=38.00)
service_breakpoint = models.CharField(max_length=16, default=1700.00)
def __str__(self):
return '%s: %s, %s: %s' % (
'bb_bonus', self.bb_bonus_qualify, 'service_breakpoint', self.service_breakpoint)
我想说Settings.objects.last().values('bb_bonus')
并返回值为self.bb_bonus_qualify
的值。我似乎遇到的常见错误是:AttributeError: 'Settings' object has no attribute 'values'
答案 0 :(得分:3)
这里的问题是您的.last()
将检索 last Settings
对象。因此,您将在.values('bb_bonus')
对象上调用Settings
。由于模型没有.values(..)
方法,因此它不会返回任何内容。
不过,您可以使用以下方法从查询集中检索特定列的值:
Settings.objects.values_list('bb_bonus_qualify', flat=True).last()
因此,我们在这里使用.values_list(..)
[Django-doc],它接受列的名称作为参数。然后,它将通常返回具有这些值的列表QuerySet
。但是,如果您指定一个列;然后,如文档所述:
如果仅传递单个字段,则也可以传递
flat
参数。如果True
,则表示返回的结果是单个值,而不是一元组。
因此,这意味着我们创建一个QuerySet
的奇异值,然后我们将检索该查询集的最后一个条目。请注意,我们不是从查询集中获取所有元素,而是在数据库中执行的查询中“插入”了.last()
,因此结果是该列的标量值最后一条记录。
.values_list(..)
因此需要在.last()
之前执行,因为否则,您是在与Settings
对象而不是{{1} }。
答案 1 :(得分:2)
AFAIK QuerySet
与__str__
没有关系-这里的问题是,您需要在获取特定项目之前指定值,而不是相反。 :
.values()