【问题标题】:How to apply a function on the values selected in Django queryset?如何对 Django 查询集中选择的值应用函数?
【发布时间】:2020-12-08 11:07:06
【问题描述】:

假设我在 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'))

【问题讨论】:

  • 这是 PostgreSQL 数据库吗?
  • 是的,它是一个 PostgreSQL 数据库。

标签: django django-queryset


【解决方案1】:

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

您可以使用Length expression [Django-doc]:

from django.db.models.functions import Length

Books.objects.values('id', 'title', length_of_title=Length('title'))

注意:通常 Django 模型被赋予一个单数名称,所以Book而不是Books

【讨论】:

  • 其实我想要一个 jsonfield 的长度,我有一个数组。我之前尝试过,但它似乎不适用于 jsonfiled。
  • @deltaforce 那么你应该更新你想要的问题,这样你就不会得到不适合你的答案。
  • @deltaforce:在您的问题中titleCharField,此外在您的示例输出中它也是一个字符串。我并不完全清楚你想要什么。将 JSON blob 写入CharField 当然会将 json blob 存储为文本,但这并不意味着 Django 或数据库会将其解释为 JSON,它只是“看起来像”的文本JSON。
【解决方案2】:

类似于威廉的回答,但使用注释。取自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 个字符或其他内容的结果。

【讨论】:

    【解决方案3】:

    你可以使用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) 
        })
    

    【讨论】:

      猜你喜欢
      • 2013-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-09
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多