当前位置: 首页 > 面试题库 >

从Django过滤器调用返回的列表的默认顺序是什么?

穆毅然
2023-03-14
问题内容

简短问题
连接到PostgreSQL数据库时,从Django过滤器调用返回的列表的默认顺序是什么?

背景
通过我自己也承认,我已经在做应用层一个糟糕的假设,其中返回的列表将是恒定的秩序,对不使用“ORDER_BY”。我要查询的项目列表不是按字母顺序排列的,也不是任何其他故意排列的。据认为,其顺序与添加到数据库中的顺序相同。

这个假设适用于数百个查询,但是当订单在不知不觉中更改时,我的应用程序报告失败。据我所知,由于我是维护数据库的唯一人员,因此在这段时间内没有触及任何记录。更令人困惑的是,在Mac OS X上运行Django应用程序时,它仍然可以按预期运行,但是在Win XP上,它更改了顺序。(请注意,提到的数百个查询是在Win XP上进行的)。

由于我在Django或PostgreSQL文档中找不到任何可以解释操作系统差异的信息,因此对此有所帮助。

呼叫范例

required_tests = Card_Test.objects.using(get_database()).filter(name__icontains=key)

编辑
今天与我的一些同事交谈后,我想出了与比约恩·林德奎斯特(BjörnLindqvist)相同的答案。

回顾过去,我绝对理解为什么这样做经常出错。使用ORM Django,sqlalchemy或其他任何方法的好处之一是,你可以编写命令而无需了解或了解(详细)它所连接的数据库。诚然,我碰巧是这些用户之一。然而,另一方面是,如果不了解数据库的详细信息,像这样的调试错误将非常麻烦,并且可能会造成灾难性的后果。


问题答案:

有否默认顺序,不能强调不够,因为每个人都没有错点。

数据库中的表不是普通的html表,它是无序的元组集。常常让只习惯MySQL的程序员感到惊讶,因为在该特定数据库中,行的顺序通常是可预测的,因为它没有利用某些先进的优化技术。例如,在以下任何查询中都无法知道将返回哪些行或它们的顺序:

select * from table limit 10
select * from table limit 10 offset 10
select * from table order by x limit 10

在上一个查询中,只有在x列中的所有值都是唯一的情况下,顺序才是可预测的。只要满足select语句的条件,RDBMS可以随意按任意顺序返回任何行。

尽管你可以在Django级别添加默认排序,但这会导致它向每个非排序查询添加order by子句:

class Table(models.Model):
    ...
    class Meta:
        ordering = ['name']

请注意,如果由于某些原因你不需要有序的行,则可能会降低性能。



 类似资料:
  • 问题内容: 假设我的web.xml中有以下内容 如果请求以/XYZ/abc.do的形式出现,过滤器的调用顺序是什么?为什么? 问题答案: 按照其映射在web.xml中定义的顺序 如果使用注释(),则顺序似乎未定义 -您仍必须在web.xml中声明条目。

  • 问题内容: 如何从“全部”更改默认过滤器选择?我有一个名为领域它有三个值:和。当我在Django admin中使用时,默认情况下将过滤器设置为“全部”,但默认情况下我想将其设置为待处理。 问题答案:

  • 问题内容: 我开始使用django-tables2(从第一印象中就可以强烈推荐),我问自己如何实现列过滤。我找不到合适的文档,但是我确定它在那里。 问题答案: 答案有点晚了,但是无论如何…我也找不到任何合适的文档来进行列过滤。有很多方法可以做到这一点: 答:手动:我添加了一个包含要过滤的字段的表单,然后在我的视图中执行以下操作: 这很好用,但是不是那么干,因为它在视图中是硬编码的。 B.使用Sin

  • 问题内容: 我只想在Flask-Admin模型列表视图中显示已付款的订单。 这是models.py: 这是Flask-Admin的ModelView: 过滤器工作正常,但我想将此过滤器设为默认值。更好的是,不要使用过滤器,而只显示查询输出的顺序。 Flask-Admin是否可以使用? 问题答案: 我们通过覆盖ModelView在我们的应用程序中执行此操作。 https://github.com/m

  • 问题内容: 如果我执行,将以什么顺序显示记录?它会采用第一列还是通过某种元数据对其进行排序? 我正在使用Oracle数据库。 问题答案: 有 NO 默认的“排序”命令。关系表 中的 行 未排序 。 获取特定订单的唯一(真正的:唯一)方法是使用 运行无时您看到的任何顺序都是 纯重合的, 并且可以在下一次执行时更改。 订单可能由于多种原因而发生变化: 其他会话运行相同的语句 表格已更新 执行计划改变

  • 参见文档“10. Web”部分