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

如何在Django中合并多个QuerySet并确保数据唯一?

解决QuerySet被覆盖并获取去重合并结果的问题

你的问题核心是循环里每次都把booking_list重新赋值,之前的结果全被覆盖了。要一次性拿到所有符合条件且去重的Booking数据,分两种情况处理:

情况1:rooms是普通数值字段(IntegerField等)

直接用__in做批量查询,这是最简洁高效的写法,配合distinct能确保结果唯一:

booking_list = Booking.objects.filter(rooms__in=numbers).distinct()

情况2:rooms是列表类型字段(比如ArrayField/JSONField存数组)

这种场景下rooms=number的写法不成立(它会检查数组是否等于单个数字),得用__contains判断数组里是否包含目标数字,再通过union合并所有QuerySet(union本身会自动去重):

if numbers:
    # 初始化第一个QuerySet
    booking_list = Booking.objects.filter(rooms__contains=[numbers[0]])
    # 遍历剩余数字,逐个合并结果
    for number in numbers[1:]:
        current_qs = Booking.objects.filter(rooms__contains=[number])
        booking_list = booking_list.union(current_qs)
else:
    # 空列表时返回空QuerySet
    booking_list = Booking.objects.none()

别再用循环赋值的方式了,既低效又容易丢数据,上面两种方法要么一次查完所有结果,要么正确合并QuerySet,都是Django ORM推荐的写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 09:20:42