如何查询 Django ArrayField 的长度?

Posted

技术标签:

【中文标题】如何查询 Django ArrayField 的长度?【英文标题】:How do I query the length of a 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] 例如 【参考方案1】:

根据docs,extra() 函数已被弃用:

将此方法作为最后的手段

这是一个旧的 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')

你可以试试这个

【讨论】:

以上是关于如何查询 Django ArrayField 的长度?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django rest 框架中设计 ArrayField?

ArrayField 中的 Django JSONField

显示和保存 Django ArrayField

Django Query 获取 ArrayField 列的所有不同值的计数

Django 查询求和 ArrayFields 的长度

Django Postgresql ArrayField 聚合