Является ли add () Django ManyToMany функцией добавления? - PullRequest
1 голос
/ 13 августа 2010

Если мой 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 похожа на добавление? Если я попытаюсь извлечь значения в цикле for, будут ли они возвращены в том порядке, в котором они были первоначально добавлены?

Продолжение:

В ответе, полученном ниже, указывалось, что db / django не несут ответственности за порядок хранения объектов.

Проблема в том, что у меня проблема с вложенной сортировкой. например Я посылаю список шаблонов в шаблон, используя order_by для его сортировки. Но шаблон должен отображать все книги, а также всех авторов для каждой книги, а также отсортировать авторов.

Поскольку между книгами и авторами существует связь ManyToMany, авторы для каждой книги не обязательно хранятся в порядке (отсюда мой оригинальный вопрос). Таким образом, шаблон отображает книги в переданном порядке, и я использовал regroup в качестве хака для сортировки авторов, извлеченных по ассоциациям из каждой книги.

У кого-нибудь есть более элегантное решение?

1 Ответ

3 голосов
/ 13 августа 2010

Реляционная база данных не дает никаких гарантий заказа.

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 )

Любой из них будет очень быстрым.

...