代码之家  ›  专栏  ›  技术社区  ›  Pankaj Sharma

django-不允许在字段上查找不支持的JSONField或join

  •  0
  • Pankaj Sharma  · 技术社区  · 7 年前

    我的模型中有一个Json字段-

    class Product(models.Model):
        ...
        detailed_stock           = JSONField(load_kwargs={'object_pairs_hook': collections.OrderedDict},default=dict)
    

    {
      "total":0,
      "5[1]":0
    }
    

    我正在尝试筛选total=0的对象,为此我尝试了-

    Product.objects.filter(detailed_stock__total = 0) 但这会带来错误-

    Unsupported lookup 'total' for JSONField or join on the field not permitted.

    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
    

    我在网上搜索,但找不到解决方案,请帮助。

    1 回复  |  直到 7 年前
        1
  •  9
  •   escaped    7 年前

    我想你正在使用 django-jsonfield load_kwargs={'object_pairs_hook': collections.OrderedDict} 而不是 django.contrib.postgres.fields.JSONField .

    django-jsonfield dict 类型,并基于一个简单的 TextField product.detail_stock str 转换为 字典 json.loads() 由该领域本身。因此,您只能使用以下操作 icontains contains 用于查询该字段。

    如果您使用postgres作为数据库,则可以充分利用 django.contrib.postgres.fields.JSONField 正如文件所述。但您必须导入正确的 JSONfield 利用 django.contrib.postgres.fields import JSONField .

    有一个解决办法 mysql (套餐 django-mysql )也是。

        2
  •  0
  •   incarnadine    5 年前

    from json_field import JSONField
    

    那么您就不能从SQL查找中获益。如上所述,JSONField覆盖 仅限文本字段。它验证JSONformat并将其转储为字符串。

    class JSONField(models.TextField):
        """ Stores and loads valid JSON objects. """
    

    from django.db import models
    data = models.JSONField(null=True)
    
    推荐文章