如何将函数应用于Django queryset中选择的值



假设Django 中有以下模型

class Book(models.Model):
id = models.AutoField(primary_key=True)
volumes = JSONField()

我想得到所有书籍的标题长度作为值-

[
{
"id": 1,
"volumes": [
{
"order": 1
},
{
"order": 2
}
],
"length_of_volumes": 2
},
]

我尝试了以下方法,但这不是正确的方法,因为它不是CharField-

from django.db.models.functions import Length
Books.objects.all().values('id', 'title', length_of_valumes=Length('volumes'))

len('title')将只确定字符串'title'的长度,因此该字符串有五个字符,因此与.values(…)一样,您使用.values(length_of_title=5)

您可以使用Length表达式[Django-doc]:

from django.db.models.functions importLength
Books.objects.values('id', 'title', length_of_title=Length('title'))

注意:通常Django模型被赋予单数名称,因此Book而不是Books

类似于Willem的答案,但使用了注释。取自https://stackoverflow.com/a/34640020/14757226.

from django.db.models.functions import Length
qs = Books.objects.annotate(length_of_title=Length('title')).values('id', 'title', 'length_of_title')

一个优点是可以添加filterexclude子句来查询标题的长度。所以,如果你只想要标题少于10个字符或其他什么的结果。

您可以使用dict结构:

values = []
for b in Books.objects.all().values('id', 'title'):
values.append({
'id': b.id, 
'title': b.title, 
'length_of_title': len(b.title) 
})

相关内容

  • 没有找到相关文章

最新更新