【问题标题】:How do I query the length of a Django ArrayField?如何查询 Django ArrayField 的长度?
【发布时间】:2018-07-30 11:32:53
【问题描述】:

我在模型中有一个 ArrayField,我正在尝试注释该字段的长度(到目前为止没有任何运气)

F('field_name__len') 不起作用,因为在 F() 中不允许加入。甚至 ModelName.objets.values('field_name__len') 不工作

有什么想法吗?

我正在使用 django 1.11

【问题讨论】:

  • 你能把你要查询的列的内容贴出来吗
  • [112,113,114,115,116,117] 例如

标签: django postgresql django-models django-queryset


【解决方案1】:

根据docsextra() 函数已被弃用:

将此方法作为最后的手段

这是一个旧的 API,我们打算在未来的某个时候弃用它。仅当您无法使用其他查询集方法表达查询时才使用它。

以下是使用自定义 Annotation 函数执行相同操作的方法:

from django.db import models

class ArrayLength(models.Func):
    function = 'CARDINALITY'

MyModel.objects.all().annotate(field_len=ArrayLength('field')).order_by('field_len')

请注意,cardinality() 函数在 PostgreSQL 9.4 或更高版本中可用。如果您使用的是旧版本,则必须使用array_length()

MyModel.objects.all().annotate(field_len=Func(F('field'), 1, function='array_length')).order_by('field_len')

第二个查询的一个警告是空数组将排在所有非空数组的前面。这可以通过将 NULL 值从 array_length 合并为 0 来解决。

【讨论】:

  • 很好的答案!只是想说明一下,我们也可以直接使用函数:.annotate(field_len=Func(F('field'), function='CARDINALITY'))
  • 请注意,如果您使用的是django-postgres-extensions,则您已经拥有CardinalityArrayLength 函数。
【解决方案2】:
ModelName.objects.extra(select={'length':'cardinality(field_name)'}).order_by('length')

你可以试试这个

【讨论】:

    猜你喜欢
    • 2022-12-17
    • 2017-12-23
    • 2017-12-24
    • 2011-11-07
    • 2017-04-29
    • 2014-06-14
    • 1970-01-01
    • 2019-07-27
    相关资源
    最近更新 更多