2009-12-07 7 views

Répondre

7

.get() retourne toujours cet objet s'il existe (et s'il y en a exactement un). Il soulève également une exception si elle n'existe pas. Par exemple

blah = MyModel.objects.get(pk=1) 

blah est une instance de MyModel. En revanche, .filter() ne renvoie pas d'erreur si elle n'existe pas.

blah = MyModel.objects.filter(pk=1234234234) 

Puis bla est une requête vide. Vous pouvez vérifier cela en appelant .count() sur blah. si blah.count() == 0 signifie qu'il n'y a aucun élément MyModel avec la clé 1234234234. De même, s'il y a beaucoup d'articles avec cette requête dire:

blah = MyModel.objects.filter(name__contains="Brian") 

Le vous obtenez un résultat de la requête qui peut être interated plus pour obtenir chaque résultat:

for b in blah: 
     print b.name 

En outre, une autre méthode intéressante simular .get() est .get_or_create() http://www.djangoproject.com/documentation/models/get_or_create/ Avec cela, vous pouvez dire:

blah,created = MyModel.objects.get_or_create(name="Brian Ray", 
              cool=False, 
              fun=True) 

Si déjà est un BrianRay qui serait normalement retourné avec le .get() il retourne juste cette instance; sinon, il le crée. Notez qu'il renvoie deux choses. La seconde est juste un drapeau pour permettre à l'appelant de savoir ce qui s'est réellement passé.

HTH, Brian Ray

4

Filtre renvoie une liste de MyModels (dans ce cas, une liste de un). Obtenir renvoie une instance de MyModel.

A propos: vous pouvez tester ces choses en cours d'exécution:

manage.py shell 
from myapp import models 

models.MyModel.objects.filter(pk=1) 

models.MyModel.objects.get(pk=1) 

Regardez la sortie de cela.

+1

Notez également que 'get' renvoie une exception' DoesNotExist' lorsque l'objet est introuvable et renvoie une exception 'MultipleObjectsFound' quand il y a plus d'un. D'autre part, 'filter' renvoie une liste vide dans le premier cas et traite évidemment le dernier cas. –