【问题标题】:Sort by related field in Django ORM按 Django ORM 中的相关字段排序
【发布时间】:2013-11-19 23:06:35
【问题描述】:

我有一个 Notes 和一个 NoteRefs 字段,其中 NoteRefs 有一个指向 Notes 的外键。我需要查询 Notes 但按相关字段排序(即 NoteRefs 的 start_ref 字段)。

我如何通过 django ORM 做到这一点?这有点在 SQL 中起作用

SELECT 
   note.user_id,
   note.content,
   note.created,
   note.modified 
FROM noteref
INNER JOIN note
ON note.id = noteref.note_id
ORDER BY noteref.start_ref

我不能使用Note.order_by('related_field'),因为相关字段不是笔记模型的一部分。据我所知,这似乎是文档所说的。如何在这里对相关字段进行排序?

编辑:模型信息

class Note(models.Model):
    user = models.ForeignKey(User, db_index=True)
    content = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)


class NoteRef(models.Model):
    note = models.ForeignKey(Note, db_index=True)
    _order = models.IntegerField(default=0)
    book = models.IntegerField(max_length=2)
    start_ref = models.IntegerField(max_length=8, db_index=True)
    end_ref = models.IntegerField(max_length=8, db_index=True)
    ref_range = models.IntegerField()
    passage = models.CharField(max_length=50)

【问题讨论】:

  • 你能添加更多关于你的模型的细节吗
  • 为什么不能选择所有按start_ref排序的NoteRef,然后调用noteref.note.
  • 你试过Note.objects.order_by("noterefs__start_ref"),或者noterefs的相关名称是什么?
  • Thomas,这种关系正好相反。 NoteRef 具有 Note 的外键。
  • @yekta 我明白,但这应该有效。 example in the documentation is quite poor — 因为 Eventself 有关系,但我很确定这确实有效。

标签: django django-models


【解决方案1】:

你应该试试Note.objects.order_by("noterefs__start_ref")

documentation doesn't make this very clear,因为它使用ForeignKeyself,但它可以工作。

现在,文档还警告如果您有多个 NoteRefs 对应一个 Note,可能会出现重复对象,因此您应该仔细检查。

【讨论】:

  • 再次感谢!我实际上有另一个字段可以用来过滤掉重复项。完美。
  • 多年来我一直想要这个功能!这工作了多长时间?
  • @DavidEyk 至少从 1.0 开始就有记录。不过,总是存在重复的风险
  • 数字!我已经多次阅读该文档但从未注意到它。
  • 啊,正确的文档在文档的Making Queries 部分。
猜你喜欢
  • 2021-07-11
  • 2017-07-02
  • 2017-07-13
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
  • 2015-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多