Postgres 9.4 Django 1.9 获取所有 json 键

Eoi*_*ray 3 python django postgresql json

我在 Django 模型中有一个 JSONField,如下所示:

from django.db import models
from django.contrib.postgres.fields import JSONField

class File(models.Model):
    metadata = JSONField(null=True, blank=True, default={})
Run Code Online (Sandbox Code Playgroud)

元数据可以填充用户喜欢的任何内容。

我希望能够列出所有 File 对象使用的所有唯一元数据键。

有没有办法使用 django 和 postgres 聚合来做到这一点?

小智 5

您可以使用django 的Func() 表达式(docs)来使用 Postgres 函数jsonb_object_keysdocs

class JsonKeys(Func):
    function = 'jsonb_object_keys'
Run Code Online (Sandbox Code Playgroud)

现在你可以写

File.objects.all().annotate(metadata_keys=JsonKeys('metadata')
Run Code Online (Sandbox Code Playgroud)