Django Postgresql ArrayField 聚合函数

22
在我的Django应用程序中,使用Postgresql,我有一个带有CharFields的ArrayField模型。我想知道是否有一种数据库方式来聚合并获取表中所有字符串的列表。例如:
  1. ['dog', 'cat']
  2. ['dog']
  3. ['cat']
将产生 ['dog', 'cat']
我知道如何在Python中完成,但是想找出在DB层面聚合的方法。 使用Django 1.8.4
1个回答

46

在PostgreSQL中,你可以进行以下操作:

SELECT DISTINCT UNNEST(array_column) FROM the_table;

那么,如果您的模型看起来像这样

class TheModel(models.Model):
    # ...
    array_field = ArrayField(models.CharField(max_length=255, blank=True),\
                             default=list)
    # ...

Django的等效代码为:

from django.db.models import Func, F
TheModel.objects.annotate(arr_els=Func(F('array_field'), function='unnest'))\
                .values_list('arr_els', flat=True).distinct()

我正在尝试过滤任何子字段中的存在,但是在Django 1.9中,此注释似乎没有正确的类型。如果我使用.filter(id__not_in=F('arr_els')),我会得到“Unsupported lookup 'not_in' for AutoField or join on the field not permitted.”的错误提示。 - Will S
@WillS,没有“not_in”查找关键字,请尝试使用“exclude”而不是“filter”(如果仍然相关)。 - Ersain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接