如何从Django的queryset中检索值?

时间:2019-05-22 21:38:31

标签: python django

我正在尝试从查询集中检索不同的.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'

2 个答案:

答案 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()