2010-08-12 4 views
0

Si mon models.py a une relation de ManyToMany entre les livres et les auteurs, et si un particulier SampleBook j'exécuter: Sample_book.authors.add (Auteur1) Sample_book.authors.add (auteur2) Sample_book.authors.add (auteur3)Est-ce qu'un Django ManyToMany ajoute() une fonction append?

sont author1, author2 et author3 stockés dans books.authors.all dans l'ordre dans lequel ils ont été ajoutés?

En d'autres termes, la fonction addTo de ManyToMany est-elle similaire à un ajout? Si j'essaie d'extraire les valeurs dans une boucle for, seront-elles retournées dans l'ordre où elles ont été initialement ajoutées?

Suite:

La réponse reçue ci-dessous a déclaré que le db/django n'a pas être tenu responsable de l'ordre dans lequel les objets ont été stockés.

Le problème est que j'ai un problème de tri imbriqué. par exemple. J'envoie une liste de livres au modèle, en utilisant order_by pour le trier. Mais le modèle doit afficher tous les livres, ainsi que tous les auteurs pour chaque livre, avec les auteurs triés également. Comme il existe une relation ManyToMany entre les livres et les auteurs, les auteurs de chaque livre ne sont pas nécessairement stockés dans l'ordre (d'où ma question originale). Donc, le modèle affiche les livres dans l'ordre passé, et j'ai utilisé le regroupement comme un hack pour trier les auteurs récupérés par association de chaque livre.

Est-ce que quelqu'un a une solution plus élégante?

Répondre

2

La base de données relationnelle ne donne aucune garantie de commande.

Django ne peut pas non plus faire de garantie, car elle dépend de la base de données relationnelle sous-jacente.

Si vous souhaitez une commande spécifique, vous devez implémenter cette commande spécifique en fournissant une sorte de numéro de séquence.


Habituellement, order_by est le plus simple, puisqu'il fait partie du jeu de requêtes. Voir http://docs.djangoproject.com/en/1.2/ref/models/querysets/#order-by-fields

La façon la plus rapide est de créer une liste et utiliser sorted dans la fonction de la vue.

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

Ou

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

Chacune de ces sera très rapide.

+0

Merci pour la clarification. J'ai utilisé regrouper dans les templates pour implémenter un tri. – Rahul

+0

@Rahul: Regrouper la balise de gabarit n'est pas une bonne idée. Habituellement, 'order_by' est le plus simple, puisqu'il fait partie du jeu de requêtes. Voir http://docs.djangoproject.com/fr/1.2/ref/models/querysets/#order-by-fields. Le moyen le plus rapide est de créer une liste et d'utiliser 'trié 'dans la fonction d'affichage. –

+0

Le problème est que j'ai un problème de tri imbriqué. par exemple. J'envoie une liste de livres au modèle, en utilisant order_by pour le trier. Mais le modèle doit afficher tous les livres, ainsi que tous les auteurs pour chaque livre, avec les auteurs triés également. Comme il existe une relation ManyToMany entre les livres et les auteurs, les auteurs de chaque livre ne sont pas nécessairement stockés dans l'ordre (d'où ma question originale). Ainsi, le modèle affiche les livres dans l'ordre adopté, mais utilise le regroupement pour trier les auteurs extraits par association de chaque livre. Des pensées? – Rahul

Questions connexes