【问题标题】:Order of Django Queryset resultsDjango Queryset 结果的顺序
【发布时间】:2019-04-16 16:56:52
【问题描述】:

我无法理解为什么 Queryset 按其顺序返回。我们列出了文章的作者,这些作者存储在名为:articlepage_authors

的 ManyToMany 表中

我们需要能够逐条选择返回和显示它们的顺序。

例如,ID 为 44918 的文章的作者为 13752(“Lee Bodding”)和 13751(“Mark Lee”)。

我在返回的 shell 中调用了这些:

Out[6]: <QuerySet [<User: Mark Lee (MarkLee@uss778.net)>, <User: Lee Bodding (LeeBodding@uss778.net)>]>

在 postgres 中调用它:SELECT * FROM articlepage_authors;

表示用户Lee Boddingid=13752首先存储在表中。

id  | articlepage_id | user_id
-----+----------------+---------
   1 |          44508 |    7781
   2 |          44508 |    7775
   3 |          44514 |   17240
….
 465 |          44916 |   17171
 468 |          44918 |   13752
 469 |          44918 |   13751

无论我尝试什么,例如删除作者,添加“Lee Bodding”,保存文章,然后添加“Mark Lee”,反之亦然——我仍然只能得到一个首先返回“Mark Lee”的查询集。

我不确定如何调试它。

一种解决方案是添加另一个定义作者顺序的字段,但我想先了解这里发生了什么。某些东西似乎已经在定义顺序,最好管理它。

【问题讨论】:

  • 将python代码添加到这个问题可能会有所帮助。在文章中添加更多名称(或其他名称)可能也很有用,以查看它是否正在进行某种排序(很难确定只有两个项目的模式)。

标签: django postgresql django-queryset wagtail


【解决方案1】:

您可以添加an order_by to your queryset 以使记录按您想要的顺序显示。警告:对于查询优化,您可能需要根据数据库的性能原因在该字段上创建索引:

默认情况下,QuerySet 返回的结果按照模型的Metaordering 选项给出的排序元组排序/强>。您可以使用 order_by 方法在每个QuerySet 的基础上覆盖它。 示例:

Entry.objects.filter(pub_date__year=2005).order_by('-pub_date', 'headline')

上述结果将按 pub_date 降序排列,然后按 headline 升序排列。 "-pub_date"前面的负号表示降序。升序是隐含的。

你把它和an extra to order by the many-to-many ID配对:

.extra(select={
    'creation_seq': 'articlepage_authors.id'
}).order_by("creation_seq")

如果您使用的是 django > 1.10,则可以直接使用该字段而无需 extra

.order_by('articlepage_authors.id')

【讨论】:

  • 这似乎以前有效,但现在我收到以下错误。有任何想法吗? File "/root/.pyenv/versions/3.7.2/lib/python3.7/site-packages/django/db/backends/utils.py", line 85, in _execute return self.cursor.execute(sql, params) django.db.utils.ProgrammingError: missing FROM-clause entry for table "articlepage_authors" LINE 1: ...authors"."legacycontentpage_id" = 5831 ORDER BY ("articlep... ^
  • 从头到尾都是这么说的。 SO cmets 对代码 sn-ps 不利——太短,没有格式化。但基本上是这样的:django.db.utils.ProgrammingError: missing FROM-clause entry for table "articlepage_authors" LINE 1: ...authors"."legacycontentpage_id" = 5831 ORDER BY ("articlep... 有什么想法吗?
  • 我现在已经解决了。出现错误是因为此时此查询集正在不同的上下文中使用。你的答案仍然正确。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
  • 2014-08-08
  • 2015-02-24
  • 1970-01-01
  • 2011-01-10
  • 2021-01-08
相关资源
最近更新 更多