Django 中的过滤器列表 JSON 包含字符串的字段
Filter List in Django JSON Field with string contains
我的 Django JSON 字段包含一个值列表,例如 ["N05BB01", "R06AX33"]。
atc_code = JSONField(default=list())
我想过滤此字段,因为 'does any string in list contain "N05"?'。
喜欢
mymodel.objects.filter(?????)
在这种情况下,如果您不使用 SQLite
或 Oracle
,则可以使用 contains
:
mymodel.objects.filter(atc_code__contains='N05')
生成这个 SQL:
SELECT * FROM "mymodel" WHERE UPPER("mymodel"."atc_code"::text) LIKE UPPER(%N05%)
基于关系的答案
通常,当以错误的方式使用关系结构时,这种方法(使用 JSONField 中的值列表)是可能的。
此处最佳方法:
- 创建一个描述您的
atc_code
实体的新模型。例如AtcCode
- 取决于 atc_code 的含义及其与
MainEnity
的关系 使用 ForeignKeyField or ManyToManyField
利用关系数据库和强大的 Django ORM 的所有优点,具有过滤、添加、删除、查询任何数据库后端等内置功能。
它适用于任何支持的数据库。当您正确使用关系时,关系数据库将运行得更快。
我的建议是当你有一个非常非结构化的对象时使用 JSONField。
我的 Django JSON 字段包含一个值列表,例如 ["N05BB01", "R06AX33"]。
atc_code = JSONField(default=list())
我想过滤此字段,因为 'does any string in list contain "N05"?'。
喜欢
mymodel.objects.filter(?????)
在这种情况下,如果您不使用 SQLite
或 Oracle
,则可以使用 contains
:
mymodel.objects.filter(atc_code__contains='N05')
生成这个 SQL:
SELECT * FROM "mymodel" WHERE UPPER("mymodel"."atc_code"::text) LIKE UPPER(%N05%)
基于关系的答案
通常,当以错误的方式使用关系结构时,这种方法(使用 JSONField 中的值列表)是可能的。
此处最佳方法:
- 创建一个描述您的
atc_code
实体的新模型。例如AtcCode
- 取决于 atc_code 的含义及其与
MainEnity
的关系 使用 ForeignKeyField or ManyToManyField
利用关系数据库和强大的 Django ORM 的所有优点,具有过滤、添加、删除、查询任何数据库后端等内置功能。
它适用于任何支持的数据库。当您正确使用关系时,关系数据库将运行得更快。
我的建议是当你有一个非常非结构化的对象时使用 JSONField。