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

Django如何筛选CharField最多含两个词的对象?支持原生SQL吗?

当然有办法实现!这里给你两种实用方案,分别用Django ORM和原生SQL来满足需求:

Django ORM 方案

要获取最多包含两个词的查询,核心逻辑是筛选空格数量≤1的记录——毕竟1个词的查询没有空格,2个词的查询只会有1个空格,超过2个词的话空格数肯定≥2。

你可以通过annotate计算每个查询的空格数量,再进行过滤:

from django.db.models import Value
from django.db.models.functions import Length, Replace

# 筛选最多含两个词的查询
two_word_or_less_queries = SearchLog.objects.annotate(
    # 计算空格数量:原字符串长度 - 去掉所有空格后的字符串长度
    space_count=Length("query") - Length(Replace("query", Value(" "), Value("")))
).filter(space_count__lte=1)

如果担心用户输入多个连续空格(比如不小心敲了好几个空格),可以先把多空格替换成单个空格再计算,避免误判:

from django.db.models import Value
from django.db.models.functions import Length, Replace

two_word_or_less_queries = SearchLog.objects.annotate(
    # 先把多个连续空格替换成单个
    cleaned_query=Replace("query", Value(" +"), Value(""), regex=True),
    # 再计算空格数
    space_count=Length("cleaned_query") - Length(Replace("cleaned_query", Value(" "), Value("")))
).filter(space_count__lte=1)
原生SQL 方案

如果更倾向于用原生SQL,思路和ORM一致,通过字符串长度差计算空格数:

SELECT *
FROM your_app_searchlog  -- 替换成你实际的表名(Django默认是app名+模型名小写)
WHERE (CHAR_LENGTH(query) - CHAR_LENGTH(REPLACE(query, ' ', ''))) <= 1;

同样,处理多连续空格的场景,可以用正则替换来统一空格:

-- MySQL/PostgreSQL 版本
SELECT *
FROM your_app_searchlog
WHERE (CHAR_LENGTH(query) - CHAR_LENGTH(REGEXP_REPLACE(query, ' +', ' ', 'g'))) <= 1;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:08:26