2011-02-28 2 views
1

Puis-je combiner l'utilisation de filter() et get() sur des ensembles de requêtes pour renvoyer un objet dans une vue django? J'ai la vue suivante;Dans Django en utilisant fiter() alors get() sur queryset?

def my_view(request, city, store, item): 
item = Item.objects.filter(store__city=city, city=city).get(item=item) 

Les articles sont tous uniques pour la ville et le magasin. J'essaie actuellement de filtrer un jeu de requête basé sur les deux champs ForeignKey, puis d'utiliser get sur un CharField mais je reçois un message d'erreur indiquant que l'objet n'existe pas. Est-ce que je m'approche de cette façon incorrecte ou ma syntaxe est-elle quelque part? Merci

Répondre

1

Si votre filtre lié retourne seulement 1 résultat, vous pouvez utiliser:

def my_view(request, city, store, item): 
    item = Item.objects.filter(store__city=city, city=city)[0] 

qui filtre les dossiers des éléments et de les stocker dans un QuerySet, qui a une structure de liste lilke, puis prendre la première élément ...

Si vous êtes sûr d'obtenir un résultat, vous pouvez utiliser au lieu de se filtre:

item = Item.objects.get(store__city=city, city=city) 

Mais s'il existe pas d'enregistrement qui correspond à votre filer cri teria, alors vous obtenez une erreur. Donc, si vous n'êtes pas sûr si le filtrage renvoie un résultat ou non, utilisez:

item = Item.objects.filter(store__city=city, city=city) 
if item: 
    item = item[0] 

qui ckecks le queryset résultant et prend le premier résultat si elle existe tout.

+0

Merci, j'étais en train de surcharger les variables, votre explication m'a aidé à jeter un autre coup d'oeil, très obligé. – thesteve