Django中使用QuerySet的union()方法未得到预期结果,查询集始终为空
Django中使用QuerySet的union()方法未得到预期结果,查询集始终为空
嗨,我看了你的代码,问题出在对Django QuerySet的union()方法的使用理解上,咱们来一步步拆解问题:
问题1:union()的参数类型不对
union()方法要求传入的是QuerySet对象,而不是单个的模型实例。你在内层循环里把time_slot(单个TimeSlot对象)传给union(),这完全不符合方法的参数要求,自然不会把任何内容添加到查询集里。
问题2:没有重新赋值QuerySet
Django的QuerySet是惰性求值的,而且union()会返回一个新的QuerySet,不会修改原来的time_slot_list对象。你每次调用time_slot_list.union(...)后,都没有把返回的新查询集重新赋值给time_slot_list,所以最初的空查询集TimeSlot.objects.none()一直没变。
给你两种修正方案:
方案一:修正union()的用法(不推荐,效率低)
如果一定要用union(),你需要传入查询集而非单个实例,并且重新赋值:
room_list = Room.objects.all() time_slot_list = TimeSlot.objects.none() for room in room_list: time_slots = TimeSlot.objects.filter(room=room) # 把查询集传给union,并重新赋值给time_slot_list time_slot_list = time_slot_list.union(time_slots) print(time_slot_list)
方案二:更高效的查询方式(强烈推荐)
其实你完全不需要嵌套循环,直接用一次数据库查询就能拿到所有关联的TimeSlot,性能好太多:
room_list = Room.objects.all() # 用__in查询所有关联这些room的time slot time_slot_list = TimeSlot.objects.filter(room__in=room_list) print(time_slot_list)
如果你的room_list就是所有Room(Room.objects.all()),那甚至可以直接写TimeSlot.objects.all(),因为所有TimeSlot都关联着Room,这样更简洁!
备注:内容来源于stack exchange,提问作者Anshul Gupta
相关产品推荐
相关产品推荐

