Django ManyToMany add()是一个追加函数吗?

时间:2010-08-12 21:09:36

标签: django-models many-to-many

如果我的models.py在书籍和作者之间有一个ManyToMany关系,并且对于我执行的特定SampleBook: Sample_book.authors.add(作者1) Sample_book.authors.add(author2) Sample_book.authors.add(author3)

是author1,author2和author3按照添加顺序存储在books.authors.all中吗?

即。 ManyToMany add()函数类似于追加?如果我尝试在for循环中提取值,它们是否会按照最初添加的顺序返回?

下面收到的答复表明db / django对存储对象的顺序不承担责任。

问题是我有一个嵌套排序问题。例如我将一系列书籍发送到模板,使用order_by对其进行排序。但模板需要显示所有书籍,以及每本书的所有作者,作者也要进行排序。

由于书籍和作者之间存在ManyToMany关系,因此每本书的作者不一定按顺序存储(因此我的原始问题)。因此,模板按照传递的顺序显示书籍,我使用重新组合作为黑客来对​​通过每本书的关联检索的作者进行排序。

有人有更优雅的解决方案吗?

1 个答案:

答案 0 :(得分:3)

关系数据库不保证订购。

Django也无法做出保证,因为它取决于底层的关系数据库。

如果您想要特定的排序,您必须通过提供某种序列号来实现该特定排序。


通常order_by最简单,因为它是查询集的一部分。见http://docs.djangoproject.com/en/1.2/ref/models/querysets/#order-by-fields

最快的方法是创建一个列表并在视图函数中使用sorted

object_list = sorted( some_query_set, key=lambda o: o.some_field )

或者

object_list= list( some_query_set )
object_list.sort( key=lambda o: o.some_field )

其中任何一个都会非常快。