Python中Django的ArrayField和JsonField不支持模糊查询吗?

某个字段非常适合使用 ArrayField 来实现,但是其中需要针对该字段做模糊搜索,,很惭愧我不会了,,特来请教。🤣


Python中Django的ArrayField和JsonField不支持模糊查询吗?
4 回复

以 Array 为例,搜索的时候可以先把 array 转成 string, 内置方法有 array_to_string 或者 array_to_tsvector.
然后再用文本搜索那一类东西.


Django的ArrayField和JsonField确实原生不支持直接的模糊查询,但可以通过一些技巧实现类似功能。

对于ArrayField,可以使用contains进行精确包含查询,或者用icontains进行不区分大小写的包含查询:

from django.contrib.postgres.fields import ArrayField
from django.db import models

class MyModel(models.Model):
    tags = ArrayField(models.CharField(max_length=50))

# 查询包含特定元素的记录
MyModel.objects.filter(tags__contains=['python'])

对于JsonField,情况更复杂一些。PostgreSQL提供了JSON操作符,但Django的ORM支持有限。你可以这样查询:

from django.contrib.postgres.fields import JSONField

class Product(models.Model):
    data = JSONField()

# 查询JSON字段中的特定键值
Product.objects.filter(data__name__icontains='search_term')

如果需要更复杂的模糊查询,可以考虑使用原始SQL或全文搜索方案。PostgreSQL的jsonb_to_tsvector函数可以配合全文搜索使用,但这需要直接写SQL。

总结:用contains操作符或JSON键路径查询。

谢谢,暂时先用的 cast 转 text,Django 里用了原生 sql 语句, 暂时还没找到什么好方法。

#2 你可以在 Django 添加自定义实现的包装函数,几行代码的事,很简单的.
这样就不用直接写原生 SQL 了.毕竟原生 SQL 跟 Django ORM 其他操作不方便配合

回到顶部