在Django中的get_list_or_404中排序

时间:2018-09-04 18:26:35

标签: python django django-orm

我正在Django中进行查询,该查询包含以非任​​意顺序排列的一系列产品ID,以及与这些ID对应的产品列表:

product_ids= [109, 33, 76, 332, 112]
products_inventory = get_list_or_404(Products, id__in=product_ids)

查询工作正常。但是,products_inventory的顺序不必与product_ids定义的元素相同(即,products_inventory中的第一个元素不是id:109的元素)。如何在products_inventory中获得由product_ids定义的相同订单?

1 个答案:

答案 0 :(得分:1)

如果您可以在数据库中进行排序,那么此答案将为您提供帮助:get_list_or_404 ordering in django

如果ID值的顺序之间没有关系,则必须在python中排序。

首先创建一个将ID转换为整数i的字典,以便在对两个ID的i进行排序时,它们将以正确的顺序排列(即,它们在product_ids中的位置):

ordering = {id: i for i, id in enumerate(product_ids)}

现在创建一个接受产品并返回一个值的函数,该值在排序时将以正确的顺序放置产品:

def keyfn(product):
    return ordering[product.id]

最后,按照key定义的keyfn对产品库存进行排序:

product_inventory.sort(key=keyfn)