如何使用Filter筛选Django数组字段中为输入字符串子串的对象
筛选ArrayField中存在输入字符串子串的Django模型对象
模型定义
class TestModel(models.Model): test_field = ArrayField(models.CharField(max_length=255, null=True, blank=True), default=list)
需求
筛选出test_field数组中任意元素是输入字符串子串的TestModel实例。
示例:
- object1的
test_field为['good','morning'] - object2的
test_field为['run','crew']
输入字符串'Good Evening'时,应返回包含object1的查询集('good'是输入字符串的子串,不区分大小写)
解决方案
利用PostgreSQL的数组处理函数结合Django ORM实现筛选,以下是不区分大小写的实现方式:
from django.db.models import Exists, OuterRef, Lower from django.contrib.postgres.functions import Unnest def get_matching_test_models(input_str): # 统一转换为小写,实现不区分大小写匹配 target_str = input_str.lower() # 子查询:拆分当前对象的test_field数组,检查是否有元素是输入字符串的子串 match_subquery = TestModel.objects.filter( pk=OuterRef('pk') ).annotate( single_element=Unnest('test_field') ).filter( target_str__icontains=Lower('single_element') ) # 筛选存在匹配项的TestModel对象 return TestModel.objects.filter(Exists(match_subquery))
说明
Unnest函数将数组字段拆分为单个元素的行,方便逐个检查- 转换为小写后使用
__icontains,确保匹配不区分大小写;若需要严格区分大小写,去掉Lower转换和__icontains,改用__contains Exists子查询确保只要对象的数组中有一个元素符合条件,就会被纳入查询集
内容的提问来源于stack exchange,提问作者Naga Srihari
相关产品推荐
相关产品推荐

