在 Django 中从 ids 列表手动创建查询集

Sve*_*ven 5 python sqlite django django-queryset

假设我有一个模型My_model,并且有该模型的 id 列表;

my_ids = [3,2,1,42]
Run Code Online (Sandbox Code Playgroud)

现在我想获得一个带有My_model.objectsid 的 QuerySet。我已经找到了这个解决方案,但它对我不起作用,因为我希望 QuerySet 中的对象与my_ids.

如何在 Django 和 Python 中转换 QuerySet 中的 id 列表?

Wil*_*sem 6

它确实不关心顺序,因为查询如下所示:

SELECT model.*
FROM model
WHERE model.pk IN (3, 2, 1, 42)
Run Code Online (Sandbox Code Playgroud)

数据库可以按照它想要的任何顺序返回值。根据您使用的数据库、索引机制等,顺序可以是“确定性的”,但它甚至有可能返回完全随机的记录。

您可以使用相当复杂的表达式来订购这些:

from django.db.models import Case, IntegerField, Value, When

my_ids = [3,2,1,42]

Model.objects.filter(
    pk__in=my_ids
).order_by(
    Case(
        *[When(pk=pk, then=Value(i)) for i, pk in enumerate(my_ids)],
        output_field=IntegerField()
    ).asc()
)
Run Code Online (Sandbox Code Playgroud)

这仍然是QuerySet, ,并且可以用于惰性查询目的,但问题仍然是为什么要根据主键的顺序对元素进行排序。通常模型(或相关模型)包含更“有趣”的元素排序方式。