问题描述
我的模型中的Json字段为-
I am having a Json field in my models as -
class Product(models.Model):
...
detailed_stock = JSONField(load_kwargs={'object_pairs_hook': collections.OrderedDict},default=dict)
我的数据库中有值-
{
"total":0,
"5[1]":0
}
我正在尝试过滤总计为0的对象,因为我尝试过-
I am trying to filter objects with total = 0, for that I tried -
Product.objects.filter(detailed_stock__total = 0)
但会引发错误-
不支持对JSONField的查找总计"或不允许在字段上进行联接.
按照 documentation 允许以下代码.
这是完整的追溯-
Traceback (most recent call last):
File "C:\Users\lenovo\AppData\Local\conda\conda\envs\myDjangoEnv\lib\site-packages\django\core\handlers\exception.py", line 35, in inner
response = get_response(request)
File "C:\Users\lenovo\AppData\Local\conda\conda\envs\myDjangoEnv\lib\site-packages\django\core\handlers\base.py", line 128, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:\Users\lenovo\AppData\Local\conda\conda\envs\myDjangoEnv\lib\site-packages\django\core\handlers\base.py", line 126, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\lenovo\AppData\Local\conda\conda\envs\myDjangoEnv\lib\site-packages\django\views\generic\base.py", line 69, in view
return self.dispatch(request, *args, **kwargs)
File "C:\Users\lenovo\AppData\Local\conda\conda\envs\myDjangoEnv\lib\site-packages\braces\views\_access.py", line 102, in dispatch
request, *args, **kwargs)
File "C:\Users\lenovo\AppData\Local\conda\conda\envs\myDjangoEnv\lib\site-packages\django\views\generic\base.py", line 89, in dispatch
return handler(request, *args, **kwargs)
File "C:\Users\lenovo\AppData\Local\conda\conda\envs\myDjangoEnv\lib\site-packages\django\views\generic\list.py", line 142, in get
self.object_list = self.get_queryset()
File "c:\Users\lenovo\Desktop\My_Django_Stuff\bekaim\accounts\views.py", line 142, in get_queryset
queryset = Product.objects.filter(detailed_stock__total = 0)
File "C:\Users\lenovo\AppData\Local\conda\conda\envs\myDjangoEnv\lib\site-packages\django\db\models\query.py", line 836, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "C:\Users\lenovo\AppData\Local\conda\conda\envs\myDjangoEnv\lib\site-packages\django\db\models\query.py", line 854, in _filter_or_exclude
clone.query.add_q(Q(*args, **kwargs))
File "C:\Users\lenovo\AppData\Local\conda\conda\envs\myDjangoEnv\lib\site-packages\django\db\models\sql\query.py", line 1253, in add_q
clause, _ = self._add_q(q_object, self.used_aliases)
File "C:\Users\lenovo\AppData\Local\conda\conda\envs\myDjangoEnv\lib\site-packages\django\db\models\sql\query.py", line 1271, in _add_q
current_negated, allow_joins, split_subq)
File "C:\Users\lenovo\AppData\Local\conda\conda\envs\myDjangoEnv\lib\site-packages\django\db\models\sql\query.py", line 1277, in _add_q
split_subq=split_subq,
File "C:\Users\lenovo\AppData\Local\conda\conda\envs\myDjangoEnv\lib\site-packages\django\db\models\sql\query.py", line 1215, in build_filter
condition = self.build_lookup(lookups, col, value)
File "C:\Users\lenovo\AppData\Local\conda\conda\envs\myDjangoEnv\lib\site-packages\django\db\models\sql\query.py", line 1069, in build_lookup
lhs = self.try_transform(lhs, name)
File "C:\Users\lenovo\AppData\Local\conda\conda\envs\myDjangoEnv\lib\site-packages\django\db\models\sql\query.py", line 1115, in try_transform
(name, lhs.output_field.__class__.__name__))
django.core.exceptions.FieldError: Unsupported lookup 'total' for JSONField or join on the field not permitted.
[31/Dec/2018 16:13:37] "GET /accounts/product-list/?clean=outofstock HTTP/1.1" 500 150927
我在互联网上进行了搜索,但找不到解决方案,请提供帮助.
I searched on internet but unable to find the solution, please help.
推荐答案
我认为您正在使用 django-jsonfield,如 load_kwargs = {'object_pairs_hook':collections.OrderedDict}
所示,而不是 django.contrib.postgres.fields.JSONField .
I think you are using django-jsonfield as indicated by load_kwargs={'object_pairs_hook': collections.OrderedDict}
instead of django.contrib.postgres.fields.JSONField.
django-jsonfield
适用于不提供本机 dict
类型且基于简单 TextField
.当您使用 product.detail_stock
访问字段值时,内部保存的 str
将使用 json.loads()
.因此,您只能使用包含
和包含
之类的操作来查询该字段.
django-jsonfield
is for databases which don't offer a native dict
type and is based on a simple TextField
. When you access the field value using product.detail_stock
the internally saved str
is converted to dict
using json.loads()
by the field itself. Hence you can only use operations like icontains
and contains
for querying that field.
如果将postgres用作数据库,则可以按照文档说明充分利用 django.contrib.postgres.fields.JSONField
.但是您必须使用 django.contrib.postgres.fields import JSONField
导入正确的 JSONfield
.
If you are using postgres as a database, you are able to take full advantage of django.contrib.postgres.fields.JSONField
as the documentation states. But you have to import the correct JSONfield
by using django.contrib.postgres.fields import JSONField
.
对于 mysql (软件包 django-mysql ).
这篇关于django-JSONField的不支持查找或不允许在字段上加入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!