我有用户的Passport 数据列表.我需要让用户的查询设置与列表中订购的Passport 数据相同的顺序.以下是包含Passport 数据的列表:

lst = ['AA1111111', 'AD2222222', 'AA3333333', 'AA4444444', 'АВ5555555']

我试图做这样的事情:

empty_queryset = Users.objects.none()
for passport_number in lst:
    user = Users.objects.filter(passport_number__exact=passport_number)
    empty_queryset |= user

我期待的是:

<QuerySet [<Users: AA1111111>, <Users: AD2222222>, <Users: AA3333333>, <Users: AA4444444>, <Users: АВ5555555>]>

但它的顺序很混乱:

<QuerySet [<Users: АВ5555555>, <Users: AA1111111>, <Users: AD2222222>, <Users: AA3333333>, <Users: AA4444444>]>

然后我try 了这个:

Users.objects.filter(passport_number__in=[i for i in lst])

但还是没有起作用

推荐答案

两者本质上做的事情是相同的,并发出一个类似于以下的查询:

SELECT *
FROM users
WHERE passport_number IN ('AA1111111',
                          'AD2222222',
                          'AA3333333',
                          'AA4444444',
                          'АВ5555555')

由于没有ORDER BY条款,因此数据库可以按照它想要的任何顺序呈现数据.通常,如果涉及索引,它可以像索引一样排序,但这更多的是一个实现细节.

您可以与.union(…) [Django-doc]个人一起工作:

SELECT *
FROM users
WHERE passport_number = 'AA1111111'
UNION
SELECT *
FROM users
WHERE passport_number = 'AD2222222'
-- …

那么看起来像:

Users.objects.none().union(
    *[User.objects.filter(passport_number=p) for p in lst], all=True
)

另一种 Select 是在Django/Python级别对项目进行排序:

lst = ['AA1111111', 'AD2222222', 'AA3333333', 'AA4444444', 'АВ5555555']
order = {k: i for i, k in enumerate(lst)}

items = sorted(
    Users.objects.filter(passport_number__in=lst),
    key=lambda x: order.get(x.passport_number),
)

但因此它是Users中的list,而不是QuerySet,因此无法通过QuerySet API进行额外的过滤、翻页等.


Note:通常Django模型的评分为singular name [django-antipatterns],所以是User而不是Users.

Django相关问答推荐

Django-表单(ModelForm)中的数据不保存在现有数据库中

执行官/start.sh:没有这样的文件或目录

未强制执行枚举值

如何在两个字段上查找 django 模型的副本?

Django 获取用户创建的对象,这些用户属于用户列表

如何计算 Django 模型中特定对象的数量?

data._mutable= 在 Django REST 框架中为真

Django SMTPAuthenticationError

virtualenv(python3.4), pip install mysqlclient 错误

是否可以将 FastAPI 与 Django 一起使用?

Django:使用render或render_to_response时添加响应头

Django:显示在每个页面上加载页面所花费的时间

获取 Django 表单中的错误列表

Django:如何编写查询以使用多列进行排序,通过模板显示

Django Admin:如何在内联中显示模型上定义的属性?

如何使 Django 表单字段仅包含字母数字字符

python/django中setattr和对象操作的区别

Django:AppRegistryNotReady()

django.db.utils.OperationalError 无法连接到服务器

如何使用 ModelSerializer 显示所有模型字段?