【发布时间】:2017-07-09 17:52:51
【问题描述】:
我有一个模型 X 带有自定义 json 字段 data,它可能有也可能没有这些键:key1、key2、key3。
我需要一种使用key1 过滤所有实例的方法。
我试过这样做:
queryset = X.objects.all()
queryset = queryset.annotate(
has_key1=(
Case(
When(~Q(data__key1__in=[None, '']), then=True),
default=False,
output_field=models.BooleanField())
)
)
但是queryset.filter(has_key1=True) 没有返回任何内容,但是有一些 key1 的记录。
直接过滤器:queryset.filter(data__key1__in=[1]) 工作正常。
任何有解决这个问题的人吗?谢谢。
【问题讨论】:
-
你在使用
JSONField类的 PosgreSQL 吗?我不认为您可以使用它来搜索密钥。 -
这是一个自定义的 jsonfield,将 python dicts 序列化为 json dicts 并再次返回。 PG是我的数据库
-
其实我错了。有一个
has_key方法:docs.djangoproject.com/en/1.10/ref/contrib/postgres/fields/… -
如果您使用的是 PostgreSQL,为什么不直接使用
JSONField或扩展它,而不必重写已经存在的内容? -
因为
JSONField不支持日期时间和其他对象类型的序列化
标签: python json django django-models