You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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))

说明

  1. Unnest函数将数组字段拆分为单个元素的行,方便逐个检查
  2. 转换为小写后使用__icontains,确保匹配不区分大小写;若需要严格区分大小写,去掉Lower转换和__icontains,改用__contains
  3. Exists子查询确保只要对象的数组中有一个元素符合条件,就会被纳入查询集

内容的提问来源于stack exchange,提问作者Naga Srihari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 06:35:16