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按模型对象列表过滤的主要内容,如果未能解决你的问题,请参考以下文章

Django,在模型中按函数过滤 Q 对象

Django:按日期范围过滤对象

Django模型按外键过滤

按 django admin 中的自定义列表显示字段进行列表过滤

django - 通过过滤对象列表获取对象列表

Django,按用户全名过滤 Q 对象