2010-07-11 49 views
10

¿Cuál es la diferencia entreDiferencia entre el filtro de Django() y get() métodos

mymodel=model.objects.get(name='pol') 

y

mymodel=model.objects.filter(name='pol') 
+0

duplicado Posible de [Diferencia entre GET y el filtro en la capa modelo Django] (http://stackoverflow.com/questions/1541249/difference-between-get-and-filter-in-django -model-layer) –

Respuesta

26

El Django QuerySet docs son muy claros en esto:

get(**kwargs)¶

Returns the object matching the given lookup parameters, which should be in the format described in Field lookups.

get() raises MultipleObjectsReturned if more than one object was found. The MultipleObjectsReturned exception is an attribute of the model class.

get() raises a DoesNotExist exception if an object wasn't found for the given parameters. This exception is also an attribute of the model class.

filter(**kwargs)

Returns a new QuerySet containing objects that match the given lookup parameters.

utilizar Básicamente conseguir cuando se desea obtener un único objeto único, y el filtro cuando se quiere conseguir todos los objetos que responden a su parámetros de búsqueda.

+0

La respuesta es útil y me perdí algunas cosas sobre get() que Sdolan contó aquí – Hafiz

5

Además, en una nota, asumiendo pol no está disponible:

if mymodel=model.objects.get(name='pol').exists()==False: 
    print "Pol does not exist" 

obtendrá: AttributeError: objeto 'Modelo' no tiene atributo 'existe'

pero:

if mymodel=model.objects.filter(name='pol').exists()==False: 
    print "Pol does not exist" 

obtendrá: Pol no existe.

I.e. Si desea ejecutar algún código dependiendo de si se puede encontrar un solo objeto, use filter. Por algún motivo existe() funciona en QuerySet pero no el objeto específico devuelto con get.

3

Tenga en cuenta que detrás de las escenas de la get Django() método se ejecuta el método filter(), pero comprueba que los resultados del filtro establecidos es exactamente un registro

0

si usted sabe que es un objeto que coincide con la consulta, utilice " obtener". Se producirá un error si se trata de más de uno y da el error como este

Traceback (most recent call last): 
File "<console>", line 1, in <module> 
File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py", line 143, in get 
return self.get_query_set().get(*args, **kwargs) 
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 407, in get 
(self.model._meta.object_name, num)) 
MultipleObjectsReturned: get() returned more than one Poll -- it returned 2! 

De lo contrario usar "filtro", que le da una lista de objetos.

1

get() devuelve un objeto que coincide con el criterio de búsqueda.

filter() devuelve un QuerySet que coincide con el criterio de búsqueda.

Por ejemplo, la siguiente

Entry.objects.filter(pub_date__year=2006) 

es equivalente a

Entry.objects.all().filter(pub_date__year=2006) 

que significa filter() es una operación poco caro si la clase de modelo tiene un gran número de objetos, mientras que get() es enfoque directo.

fuente: Django making queries

Cuestiones relacionadas