我正在 Django 1.5.4 和 PostgreSQL 9.3 中工作,使用Django-jsonfield https://github.com/bradjasper/django-jsonfield对于 JSONField。
以下查询引发数据库错误(无法识别 json 类型的相等运算符):
ModelWithJsonField.objects.annotate(count=Count('field_to_count_by'))
The field_to_count_by
不是 JSONField,普通的 int 字段。
我有什么想法可以解决问题并仍然使用注释吗?
引擎盖后面有什么注释?
我遇到了同样的问题,最后(今天)通过在 psql 控制台中以管理员身份运行它来实现了一个假操作符:
-- This creates a function named hashjson that transforms the
-- json to texts and generates a hash
CREATE OR REPLACE FUNCTION hashjson(
json
) RETURNS INTEGER LANGUAGE SQL STRICT IMMUTABLE AS $$
SELECT hashtext($1::text);
$$;
-- This creates a function named json_eq that checks equality (as text)
CREATE OR REPLACE FUNCTION json_eq(
json,
json
) RETURNS BOOLEAN LANGUAGE SQL STRICT IMMUTABLE AS $$
SELECT bttextcmp($1::text, $2::text) = 0;
$$;
-- This creates an operator from the equality function
CREATE OPERATOR = (
LEFTARG = json,
RIGHTARG = json,
PROCEDURE = json_eq
);
-- Finaly, this defines a new default JSON operator family with the
-- operators and functions we just defined.
CREATE OPERATOR CLASS json_ops
DEFAULT FOR TYPE json USING hash AS
OPERATOR 1 =,
FUNCTION 1 hashjson(json);
(深受启发this http://www.postgresql.org/message-id/39D50797-720D-4614-81F5-BA6B0677B74C@justatheory.com thread)
我还在 django-jsonfield GitHub 中引用了您的问题issue https://github.com/bradjasper/django-jsonfield/issues/57.
注意 :
- 我对这将产生的影响的了解非常有限。也许这并不是一个好主意。这些实现很幼稚,但应该足够了。或者可能不是。
- 特别是,相等运算符检查文本相等性,而不是语义 json 相等性。但就 django-jsonField 而言,我认为我们真正需要正确结果的可能性很小(可能 SELECT FALSE 甚至可以解决问题)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)