假设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')
一个优点是可以添加filter
或exclude
子句来查询标题的长度。所以,如果你只想要标题少于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)
})