Django按模型对象列表过滤
Posted
技术标签:
【中文标题】Django按模型对象列表过滤【英文标题】:Django filtering by list of model objects 【发布时间】:2014-08-22 02:50:53 【问题描述】:我正在尝试通过检查对象是否在这些对象的列表中来过滤查询集。
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]
但是,我认为这样对性能的影响会更糟。
最好/最快的方法是什么?谢谢。
【问题讨论】:
【参考方案1】:经验法则是尽可能通过 SQL 进行过滤,所以我会选择
qs = Employee.objects.filter(id__in=[emp.id for emp in employee_list], [other_filters])
我没有任何性能测试来支持这一点。
【讨论】:
我可能注意到这在很大程度上取决于查询集、列表和用例的大小【参考方案2】:正如 Martol1ni 所说,您希望尽可能在 SQL 级别进行过滤,因此我认为您的方法确实会逐渐变慢,但另一个问题...
基于 Django 文档:https://docs.djangoproject.com/en/dev/ref/models/querysets/ 我认为 yourid__in
应该是整数 id 列表,而不是模型列表。
编辑: 哦,我看到他在回答中提到了这一点,但并没有明确指出你的问题不正确。
编辑2:
但是,是的,如果您想确定,真正重要的是真实世界的性能,您可以使用django-debug-toolbar 来完成。在我看来,真正的问题是 id__in
的滥用,它会导致你找到更棘手的方法来做你想做的事情。
【讨论】:
我对每种不同的方法都运行了分析器,但没有发现它们之间有太大的区别。显然,我的测试数据集比生产数据集小得多,但是从对象列表中构造一个 id 列表,然后在 id_list 中过滤 id__ 似乎是最快的。以上是关于Django按模型对象列表过滤的主要内容,如果未能解决你的问题,请参考以下文章