如何查询 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
,则您已经拥有Cardinality
和ArrayLength
函数。【参考方案2】:
ModelName.objects.extra(select='length':'cardinality(field_name)').order_by('length')
你可以试试这个
【讨论】:
以上是关于如何查询 Django ArrayField 的长度?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 django rest 框架中设计 ArrayField?
ArrayField 中的 Django JSONField