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

如何在Django中通过单次数据库查询获取两字段含指定子串的唯一值

单次查询实现跨字段获取包含子串的唯一值

当然可以!你完全可以通过单次数据库层面的合并操作来实现这个需求,不用先查两次再在Python里转集合去重,这样性能会更好(尤其是数据量大的时候,减少了数据库往返和内存消耗)。

解决方案:使用QuerySet的union()方法

Django的QuerySet自带union()方法,可以合并两个查询集,并且默认会自动去重(相当于SQL里的UNION,而不是UNION ALL),正好匹配你的需求:

# 先分别构造两个查询集,分别获取a和b字段中包含子串的值
a_query = MyModel.objects.filter(a__icontains=substring).values_list("a", flat=True)
b_query = MyModel.objects.filter(b__icontains=substring).values_list("b", flat=True)

# 用union合并,数据库层面完成去重
unique_values = list(a_query.union(b_query))

验证你的示例场景

针对你给出的测试数据:

  • MyModel(a="x", b="y") → a字段匹配,贡献"x"
  • MyModel(a="xx", b="xxx") → a字段贡献"xx",b字段贡献"xxx"
  • MyModel(a="z", b="xxxx") → b字段贡献"xxxx"

执行上述代码后,unique_values会直接得到["x", "xx", "xxx", "xxxx"],完全符合你的期望。

补充说明

  • union()方法会确保最终结果是唯一的,不需要再手动转集合
  • 这个操作是在数据库层面完成的,比先拉取所有数据到Python再处理要高效得多
  • 如果特殊场景需要保留重复值,可以传入all=True参数,对应SQL的UNION ALL

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:50:33