我试图通过检查对象是否在这些对象的列表中来过滤查询集。
employee_list = [<Employee: A>, <Employee: B>, <Employee: C>]
qs = Employee.objects.filter(id__in=employee_list, [other_filters])
在上面运行之后,qs是一个空列表。我在想我可以制作一个新的列表,例如
employee_ids = [emp.id for emp in employee_list]
qs = Employee.objects.filter(id__in=employee_ids, [other_filters])
我还没有对这种方法进行基准测试,但我认为性能可能会受到影响。或者,我可以在事后与列表相交:
qs = Employee.objects.filter([other_filters])
filtered_qs = [emp for emp in employee_lids if emp in qs]
但是,我认为这种表现会更糟糕。
最好/最快的方式是什么?感谢。
答案 0 :(得分:1)
正如Martol1ni所说,你希望尽可能在SQL级别进行过滤,所以我认为你的方法会逐渐变慢,但另一个问题......
基于Django文档:https://docs.djangoproject.com/en/dev/ref/models/querysets/我认为您的id__in
应该是整数ID的列表,而不是模型列表。
修改强> 哦,我看到他在答案中涵盖了这一点,但在你的问题中并不明确它是不正确的。
<强> EDIT2:强>
但是,是的,如果你想确切地知道,真正重要的是真实世界的表现,你可以用django-debug-toolbar来做。在我看来,虽然真正的问题是id__in
滥用导致你找到了做你想做的事情的棘手方法。
答案 1 :(得分:0)
经验法则是通过SQL尽可能多地过滤,所以我会选择
qs = Employee.objects.filter(id__in=[emp.id for emp in employee_list], [other_filters])
我没有任何性能测试来支持这一点。