如何在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
相关产品推荐
相关产品推荐

