Django按模型对象列表过滤

时间:2014-07-01 13:53:49

标签: python django django-queryset intersection django-filter

我试图通过检查对象是否在这些对象的列表中来过滤查询集。

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]

但是,我认为这种表现会更糟糕。

最好/最快的方式是什么?感谢。

2 个答案:

答案 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])

我没有任何性能测试来支持这一点。