【问题标题】:Django filtering by list of model objectsDjango按模型对象列表过滤
【发布时间】: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]

但是,我认为这样对性能的影响会更糟。

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

【问题讨论】:

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


    【解决方案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__ 似乎是最快的。
    猜你喜欢
    • 2020-08-02
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 2021-10-23
    • 2013-03-16
    • 2017-08-05
    • 2011-01-10
    相关资源
    最近更新 更多