【问题标题】:Django ORM object sequence when using a list as filter condition使用列表作为过滤条件时的Django ORM对象序列
【发布时间】:2017-06-09 17:36:29
【问题描述】:

当我们使用列表作为过滤条件时,Django ORM 是否保证过滤顺序?

result = Model.objects.filter(id__in=id_list, user__id=user.id)

id_list 是这样的:[1, 2, 3, 4, 5] 结果总是保持id_list后面的顺序吗?

Django 文档在哪里提到了这个? 谢谢!

【问题讨论】:

  • 您是在问result 中的项目是否与id_list 中的相应项目具有相同的顺序?如果是这样:不,数据库不保证这一点,Django 也不保证。如果没有使用order_by() 的显式排序,则顺序是任意的。
  • @knbk "你是问result中的items是否和id_list中对应items的顺序相同?" > YES 谢谢!

标签: django django-models django-orm


【解决方案1】:
pk_list = [10, 2, 1]
clauses = ' '.join(['WHEN id=%s THEN %s' % (pk, i) for i, pk in enumerate(pk_list)])
ordering = 'CASE %s END' % clauses
queryset = Model.objects.filter(pk__in=pk_list).extra( select={'ordering': ordering}, order_by=('ordering',))`

【讨论】:

    猜你喜欢
    • 2010-11-04
    • 1970-01-01
    • 2011-01-10
    • 2016-04-22
    • 2021-12-05
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    相关资源
    最近更新 更多