【问题标题】:Django search query in JSON dataJSON数据中的Django搜索查询
【发布时间】:2021-11-17 05:50:21
【问题描述】:

不支持查找 JSONField 的“名称”或不允许加入该字段。

错误: /search/ 处的字段错误

不支持查找 JSONField 的“名称”或不允许加入该字段。

views.py

    query = request.GET.get('search')
    if query:
        product_list = product_list.filter(
            Q(product_name__icontains=query) |
            Q(brand__brand_name__icontains=query) |
            Q(model__name__icontains=query) |
            Q(gtin_no__icontains=query) |
            Q(oem_no__icontains=query) |
            Q(tag__icontains=query)
        )

models.py

    product_name = models.CharField(max_length=300)
    slug = models.SlugField(unique=True, editable=False, max_length=300)
    category = models.ForeignKey('ProductCategory', null=False, on_delete=models.CASCADE, max_length=100)
    brand = models.ManyToManyField('Brand', null=True, max_length=100)
    model = JSONField(null=True, max_length=10000)
    product_code = models.CharField(blank=True, max_length=20)
    gtin_no = JSONField(blank=True, max_length=10000)
    oem_no = JSONField(blank=True, null=True, max_length=10000)
    tag = JSONField(blank=True, null=True, max_length=10000, default=None)

示例模型 JSON 数据:

{
    "data": "[['Car Parts', 'Ssangyong'], ['Industrial Parts', 'Lombardini'], ['Mercedes-Benz Sprinter', 'Sprinter OM 601, OM 602 DE LA']]"
}

GTIN JSON 数据示例:

{
    "data": [
        "4047755219970"
    ]
}

OEM JSON 数据示例:

{
    "data": [
        "624 320 0028",
        "625 320 0028"
    ]
}

有时这个 JSON 数据可能是空的。

{
    "data": [
        "None"
    ]
}

【问题讨论】:

    标签: python json django django-views


    【解决方案1】:

    这样做之后:

    query = request.GET.get('search')
        if query:
            product_list = product_list.filter(
                Q(product_name__icontains=query) |
                Q(brand__brand_name__icontains=query) |
                Q(model__name__icontains=query) |
                Q(gtin_no__icontains=query) |
                Q(oem_no__icontains=query) |
                Q(tag__icontains=query)
            )
    

    您可以像这样将product_list 转为context:

    context = {
       "products": product_list # <- you can name it whatever you want.
    }
    

    然后执行此操作以将上下文传递给您正在使用的任何 html 文件:

    render(request, "path/to/htmlfile", context=context, status=200) # by the way, you can set status code here.
    

    编辑

    我认为您可以从Q(model__name__icontains=query) 中删除__name,因为错误表明它会导致问题。

    【讨论】:

    • 谢谢,但我已经写了这段代码。我没有在 JSON 数据中搜索我的查询。
    • FieldError at /search/ Unsupported lookup 'name' for JSONField or join on the field not allowed.
    • 你能告诉我们你的完整错误吗?请在您的问题中添加错误,因为在评论中很难阅读。
    猜你喜欢
    • 1970-01-01
    • 2021-12-17
    • 2018-02-21
    • 2018-12-21
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    • 2018-03-21
    • 2017-04-25
    相关资源
    最近更新 更多