【问题标题】:Filtering issue with Django, MySQL, and JSONFieldDjango、MySQL 和 JSONField 的过滤问题
【发布时间】:2020-03-22 03:26:15
【问题描述】:

我正在排除在 Django 中过滤我的模型的问题。我还在为我的模式内的一个字段使用所有“类别”的 django_mysql JSONField 字段类型。


class Image(models.Model):
    class Meta:
        verbose_name = "Image"
        verbose_name_plural = "Images"

    image = models.ImageField(verbose_name="Image Asset", upload_to='assets/images/', blank=True, null=True)
    is_published = models.BooleanField(verbose_name="Is this asset published", default=True, null=False)
    meta_format = models.CharField(verbose_name="Meta Format", max_length=200, blank=True, null=True)
    meta_width = models.CharField(verbose_name="Meta Width", max_length=200, blank=True, null=True)
    meta_height = models.CharField(verbose_name="Meta Height", max_length=200, blank=True, null=True)
    categories = JSONField(default=list)

作为参考,类别是我试图过滤的字段。

假设我的提要中有这个条目:

{
    "id": 18,
    "url": "http://localhost:8001/images/18/",
    "image": "https://cdn.test.com/assets/images/person.jpg",
    "is_published": false,
    "meta_format": "JPEG",
    "meta_width": "1466",
    "meta_height": "800",
    "categories": "[{\"category\": \"staff_gallery\"}]"
}

唯一会返回这个结果的是

>>> ImageAsset.objects.filter(categories="[{\"category\": \"staff_gallery\"}]")

这是不可行的,因为很可能会有不止一个类别。如果条目更改为"categories": "[{\"category\": \"staff_gallery\"},{\"category\": \"test\"}]",则整个查询不返回任何内容。

解决这个问题的一种方法是把它变成一个列表或数组......所以基本上上面的类别会变成"categories": "[\"staff_gallery\"]"。通过这样做,以下查询将起作用并返回我想要的查询。

>>> ImageAsset.objects.filter(categories__contains="[\"staff_gallery\"]")

但是...当我将条目更改为 "categories": "[\"staff_gallery\",\"test\"]" 时,查询将停止工作,除非我在查询中准确指定该字符串 ("[\"staff_gallery\",\"test\"]")。

这个类别字段最初是一个数据字段,我在其中存储的不仅仅是这个,但考虑到我遇到的问题,我已经将它转换为一个类别字段。我的问题是,如果我想不通,我会将其切换为 char 字段并在其中搜索。我认为这些 JSON 字段应该更加面向未来且易于使用……但我发现事实并非如此。

TL;DR:过滤(如文档所述)不起作用。 JSON 文件过滤除了字段内容的完全匹配外,没有任何作用。

【问题讨论】:

    标签: json django django-models django-rest-framework


    【解决方案1】:

    JSONField documentation 中所述,有特定的查找来查询 JSONField。

    例如,如果您想获取“staff_gallery”类别的图像,则必须使用以下内容:

    ImageAsset.objects.filter(categories={'category': 'staff_gallery'})
    

    查看上面的链接了解更多详情。

    【讨论】:

    • 是的,这仍然对我不起作用......这是我的问题的一部分。 >>> ImageAsset.objects.filter(categories={'category': 'staff_gallery'})
    • 我认为您的问题可能是您在 JSONField 中存储了一个字符串,请确保在创建对象时将字典而不是字符串传递给 categories 字段
    • 我不得不同意你的观点,但无论我做什么,我都无法改变它作为字符串存储的事实,无论我如何存储它。我还有其他表现不一样的 JSON 字段,所以我现在有点困惑。
    • 查看您提供的条目似乎提要已将categories 作为字符串提供给您,您是否尝试在将其分配给您的模型之前对其进行解析?比如:image_asset.categories = json.loads(feed_entry['categories'])
    猜你喜欢
    • 2016-07-23
    • 2018-10-02
    • 2020-10-08
    • 2016-03-25
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 2023-03-28
    相关资源
    最近更新 更多