【问题标题】:Is a Django ManyToMany add() an append function?Django ManyToMany add() 是追加函数吗?
【发布时间】:2011-03-29 04:13:00
【问题描述】:

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

author1、author2 和 author3 是否按添加顺序存储在 books.authors.all 中?

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

续:

下面收到的回答说db/django不对对象的存储顺序负责。

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

由于书籍和作者之间存在多对多关系,因此每本书的作者不一定按顺序存储(因此是我最初的问题)。因此,模板按传递的顺序显示书籍,我使用 regroup 作为 hack,对从每本书中检索到的作者进行排序。

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

【问题讨论】:

    标签: django-models many-to-many


    【解决方案1】:

    关系数据库不保证排序。

    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 )
    

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

    【讨论】:

    • 感谢您的澄清。我在模板中使用了重组来实现排序。
    • @Rahul:重新组合模板标签不是一个好主意。通常order_by 是最简单的,因为它是查询集的一部分。见docs.djangoproject.com/en/1.2/ref/models/querysets/…。最快的方法是创建一个列表并在视图函数中使用sorted
    • 问题是我有一个嵌套排序问题。例如我将书籍列表发送到模板,使用 order_by 对其进行排序。但是模板需要显示所有书籍,以及每本书的所有作者,作者也进行了排序。由于书籍和作者之间存在多对多关系,因此每本书的作者不一定按顺序存储(因此是我最初的问题)。因此,模板按传递的顺序显示书籍,但使用 regroup 对通过关联从每本书中检索到的作者进行排序。有什么想法吗?
    • @Rahul:“有什么想法吗?”是的。把它放在问题中。不是 cmets。
    • 完成。不确定编辑相同的问题或发布新问题是否是个好主意(因为从技术上讲,新问题尚未得到回答......)但这似乎是一个小问题。期待您提出解决问题的任何想法。
    猜你喜欢
    • 2010-11-16
    • 2016-01-02
    • 1970-01-01
    • 2016-09-19
    • 2016-11-14
    • 2018-07-23
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多