2010-01-14 5 views
13

Je veux trier un QuerySet de contacts par un champ connexe. Mais je ne sais pas comment. Je l'ai essayé comme ça, mais ça ne marche pas.django classer par domaine connexe

foundContacts.order_by("classification.kam") 

En fait, dans un modèle que je peux accéder à la valeur kam d'un contact par contact.classification.kam car il est une relation OneToOne.

Les modèles (simplifié) ressemblent à ceci:

class Classification(models.Model): 
    kam = models.ForeignKey(User) 
    contact = models.OneToOneField(Contact) 

class Contact(models.Model): 
    title = models.ForeignKey(Title, blank=True, null=True) 
    first_name = models.CharField(max_length=200) 
    last_name = models.CharField(max_length=200) 

Répondre

22

Il devrait être:

foundContacts.order_by("classification__kam") 

Voici un lien pour la documentation de Django sur faire des requêtes qui enjambent les relations: http://docs.djangoproject.com/en/1.1/topics/db/queries/#lookups-that-span-relationships

Vous pouvez également voir quelques exemples dans la référence order_by:
https://docs.djangoproject.com/en/1.6/ref/models/querysets/#django.db.models.query.QuerySet.order_by

+3

La syntaxe est correcte, mais cela n'a rien à voir avec view vs template. Vous ne pouvez pas du tout faire ce type d'ordre dans le modèle (car la syntaxe du modèle ne vous permet pas d'appeler des fonctions avec des arguments). Mais la syntaxe double-underscore est utilisée pour toutes les traversées de relations * dans * un appel de fonction - filter, annotate, order_by, etc. Alors que la syntaxe normale est pour quand vous avez un objet et que vous voulez faire référence à l'objet. –

+0

La formulation était pauvre et je l'ai enlevé. –

+0

Ok ça marche maintenant. Merci! –