2010-01-06 5 views
2

Tenir compte de ce modèle exemple:Trier par nom d'affichage au lieu de la valeur réelle

MODEL_CHOICES = ( (u "SPAM", u "Spam"), (u "XOUP", u "Eggsoup") , )

(snip)

type = models.CharField (MAX_LENGTH = 4, choix = MODEL_CHOICES)

(La mise en œuvre effective est spécifique au domaine et non-anglais, donc cet échantillon doit faire.)

Lors de la construction ma requête, je voudrais trier les résultats par ce champ de type, et le présent les résultats à l'utilisateur. Naturellement, je voudrais trier par le nom d'affichage de ce champ.

Quelque chose le long des lignes de:.

documents = MyModel.objects.filter (...) order_by ("type")

Cependant, seule [query-set].order_by([field]) permet le tri par nom de domaine , ce qui entraînera SPAM < XOUP (à la machine) même si Eggsoup < Spam (au lecteur humain).

Considérez cet ensemble de cas classés par type:

Nom | Type

obj1 | SPAM

obj2 | SPAM

obj3 | SPAM

obj4 | XOUP

obj5 | XOUP

Mais ceci est l'ordre que l'utilisateur verra, à savoir l'utilisateur verra le nom d'affichage, pas la valeur du champ interne de la colonne de type:

Nom | Type

obj1 | Spam

obj2 | Spam

obj3 | Spam

obj4 | Eggsoup

obj5 | Eggsoup

Qui, aux yeux de l'utilisateur humain, n'est pas trié correctement.

Existe-t-il une fonctionnalité dans Django qui permet le tri par nom d'affichage? Ou un moyen d'accomplir cela "manuellement"?(Renommer les choix afin que le nom d'affichage ait le même ordre que les valeurs réelles n'est pas une option.)

Répondre

4

Si les ensembles de résultats sont suffisamment petits, vous pouvez effectuer un tri en mémoire des résultats dans le code. Je ne peux pas penser à une manière décente de trier les résultats au niveau de la base de données. Il serait certainement possible si vous avez utilisé une procédure stockée qui est au courant des noms d'affichage, mais vous devez écrire raw sql. Quant au manuel sorting- vous pouvez utiliser quelque chose comme ceci:

obj_list = list(Model.objects.all()) 
import operator 
obj_list.sort(key=operator.methodcaller('get_foo_display')) 

Voici quelques exemples de belles sur la façon de trier les listes en Python: http://wiki.python.org/moin/HowTo/Sorting

+0

Merci. L'utilisation de l'opérateur semble chouette, je n'étais pas au courant. – nikola

0

En supposant que le nom d'affichage provient également du modèle, vous pouvez trier par ce champ pour ordonner les choix comme vous vouloir. Si les choix sont constants comme dans votre question, vous pouvez simplement changer l'ordre dans la constante. En fin de compte, les choix sont juste une liste de tuples, donc vous pouvez trier avec un tri Python normal. Le Python wiki has a nice example de trier une liste de tuples sur le deuxième élément.

+0

Marc, merci pour votre réponse. Cependant, il ne s'agit pas de l'ordre de tri des choix mais de l'ordre des résultats. J'ai édité la question originale pour clarifier le point. – nikola

+0

Je ne sais toujours pas d'où vient le nom d'affichage. Est-ce que cela fait partie du modèle? –

+0

C'est une fonctionnalité de Django - lorsque vous définissez les choix comme deux tuples, le premier élément devient la valeur réelle stockée dans la table, et le deuxième élément est le nom d'affichage, qui, par exemple, est utilisé dans l'admin ou lors de la création de formulaires à partir du modèle. Voir ici: http://www.djangoproject.com/documentation/models/choices/ – nikola

Questions connexes