json - Django、MySQL 和 JSONField 的过滤问题
问题描述
我正在对在 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 文件过滤除了字段内容的完全匹配外,没有任何作用。
解决方案
如JSONField 文档中所述,有特定的查找来查询 JSONField。
例如,如果您想获取“staff_gallery”类别的图像,则必须使用以下命令:
ImageAsset.objects.filter(categories={'category': 'staff_gallery'})
检查上面的链接以获取更多详细信息。
推荐阅读
- javascript - 无法从 Firebase 更新和删除对象
- r - r gsub 正则表达式仅保留 [A-z0-9_] 但 ^ 也保留
- r - 西里尔字母 R 中的情绪分析
- python - 创建安装在现有包中的包
- flutter - 用颤振实现一个可滚动的抽屉,当我旋转时它显示底部溢出
- php - 在 var/www/html/admin/vendor/nesbot/carbon/src/Carbon/Traits/Units.php 中遇到格式不正确的数值
- compilation - 在 IRTools 发电机中提取自己的 IR
- sml - 有没有办法显示 SML 包/库的每个功能?我正在使用 PolyML
- delphi - 如何避免解析从数据库中获取的数据以动态创建表单?
- javascript - 如何识别和消除 wordpress 上的冲突脚本?