【问题标题】:Django filter __in keep order and duplicatesDjango过滤器__in保持顺序和重复
【发布时间】:2021-07-08 00:28:44
【问题描述】:

假设我有一个列表

items = [1,2,5,1,2,1]

我想要实现的是在列表中获取所有示例对象并保持顺序和重复。如下:

def get_all_keep_order_and_duplicates():
    return [Example.objects.get(pk=pk) for pk in items]

我的问题是,有没有办法更有效地做到这一点,只需一个查询而不是单独获取每个项目?

到目前为止,我已经尝试过以下保持订单但不返回重复项的方法:

def get_all_keep_order():
    return Example.objects.filter(pk__in=items).order_by(
        Case(*[When(pk=pk, then=count) for count, pk in enumerate(items)])
    )

【问题讨论】:

    标签: django filtering


    【解决方案1】:

    我不明白为什么你必须在查询中这样做,为什么不在 python 中这样做:

    exdict = {e.pk: e for e in Example.objects.all()}
    return [exdict[e] for e in items]
    

    这只是 1 个数据库查询。

    【讨论】:

    • 我更愿意在数据库级别做所有事情,但似乎过于复杂或不确定是否可能。这是迄今为止我见过的最好的方法,所以最终可能会像这样实施。
    • 对我来说这似乎不是一个自然的数据库查询。这是应该在 Python 中处理的事情。
    猜你喜欢
    • 2015-12-30
    • 2021-06-09
    • 1970-01-01
    • 2018-02-20
    • 2016-03-05
    • 2018-01-16
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多