gpt4 book ai didi

python - 按列表中的值对查询集进行排序

转载 作者:太空狗 更新时间:2023-10-29 20:11:41 25 4
gpt4 key购买 nike

是否可以通过查询中提供的元素列表对 Django 查询集进行排序?例如,如果我这样做

m.objects.filter(id__in=[3,1,8])

我不希望查询集的顺序是 id 3 的元素、id 1 的元素和 id 8 的元素。

谢谢

最佳答案

因为在 Django >= 1.11 中存在 CaseWhen 你可以用一种更像 orm 的方式来保持你的查询集的所有好处:

from django.db import models

order = ['b', 'a', 'z', 'x', 'c']
_whens = []

for sort_index, value in enumerate(order):
_whens.append(
models.When(my_field=value, then=sort_index)
)

qs = MyModel.objects.annotate(
_sort_index=models.Case(
*_whens,
output_field=models.IntegerField()
)
)

qs.order_by('_sort_index')

这将生成如下内容:

from django.db import models

order = ['b', 'a', 'z', 'x', 'c']
qs = MyModel.objects.annotate(
_sort_index=models.Case(
models.When(my_field='b', then=0),
models.When(my_field='a', then=1),
models.When(my_field='z', then=2),
models.When(my_field='x', then=3),
models.When(my_field='c', then=4),
output_field=models.IntegerField()
)
).order_by('_sort_index')

我建议只对少量列表项使用它,因为它会破坏数据库查询。

https://docs.djangoproject.com/ko/1.11/ref/models/conditional-expressions/#case

关于python - 按列表中的值对查询集进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5966462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com