2009-11-29 14 views
4

Supposons mon modèle ressemble à ceci:Obtenir des clés étrangères uniques dans Django?

class Farm(models.Model): 
    name = ... 

class Tree(models.Model): 
    farm = models.ForeignKey(Farm) 

... et je reçois un QuerySet de Tree objets. Comment puis-je déterminer quelles fermes sont représentées dans ce QuerySet?

+0

Par "unique" voulez-vous dire "distinct"? –

Répondre

4

Il pourrait y avoir une meilleure façon de le faire avec Django ORM et le garder paresseux, mais vous pouvez obtenir ce que vous voulez avec python régulier (du haut de ma tête):

>>> set([ t.farm for t in qs ]) 
+0

C'est ce que j'étais sur le point de mettre. – Mez

+0

Ça marchera puisque je dois les parcourir de toute façon plus tard. Merci. – magneticMonster

+0

Les crochets ne sont pas nécessaires ici, vous pouvez utiliser: 'set (tfarm pour t dans qs)' –

0

Voici une façon d'avoir la base de données faire le travail pour vous:

farms = qs.values_list('farm', flat=True).distinct() 
#values_list() is new in Django 1.0 

valeur de retour doit évaluer à quelque chose comme:

(<Farm instance 1>, <Farm instance5>) 

étaient des fermes qui auront des arbres dans cet ensemble de requêtes particulier.

Pour toutes les fermes qui ont des arbres, utilisez qs = Tree.objects

Gardez à l'esprit que si vous ajoutez order_by('some_other_column') alors distinct s'appliquera aux combinaisons distinctes de « ferme » et « some_other_column », parce que d'autres colonnes sera également dans la requête SQL pour la commande. Je pense que c'est une limitation (pas une fonctionnalité prévue) dans l'API, il est décrit dans le documentation.

+0

donc cela pourrait être qs.values ​​('farm'). Distinct()? Est-ce que cela renvoie une liste plate ou un qs ou quoi? .. devrait regarder dans les docs ... –

+1

Cela vous donnera TOUTES les fermes. La question demande les fermes liées à l'arbre qs seulement. –

+2

Remplacez juste Tree.objects avec le jeu de requêtes Tree approprié et il ne vous donnera pas toutes les fermes. –

Questions connexes