2010-07-11 26 views

Trả lời

26

là gì Các Django QuerySet docs rất rõ ràng về vấn đề này:

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.

Về cơ bản sử dụng nhận được khi bạn muốn có được một đối tượng duy nhất duy nhất, và bộ lọc khi bạn muốn để có được tất cả các đối tượng phù hợp với các thông số tra cứu của bạn.

+0

Trả lời là hữu ích và tôi đã bỏ lỡ một vài điều về get() mà Sdolan đã nói ở đây – Hafiz

5

Ngoài ra, trên một mặt lưu ý, giả sử pol không có sẵn:

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

bạn sẽ nhận được: AttributeError: đối tượng 'mẫu' không có thuộc tính 'tồn tại'

nhưng:

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

bạn sẽ nhận được: Pol không tồn tại.

I.e. Nếu bạn muốn chạy một số mã tùy thuộc vào việc một đối tượng có thể được tìm thấy hay không, hãy sử dụng bộ lọc. Đối với một số lý do tồn tại() hoạt động trên QuerySet nhưng không phải là đối tượng cụ thể trả về với get.

3

Lưu ý rằng đằng sau hậu trường các get django() phương pháp điều hành phương pháp lọc(), nhưng kiểm tra rằng kết quả lọc thiết lập chính xác là một bản ghi

0

nếu bạn biết đó là một đối tượng phù hợp với truy vấn của bạn, sử dụng " được". Nó sẽ thất bại nếu nó nhiều hơn một và cung cấp cho các lỗi như thế này

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! 

Nếu không sử dụng "bộ lọc", cung cấp cho bạn một danh sách các đối tượng.

1

get() trả về một đối tượng khớp với tiêu chí tra cứu.

filter() trả về QuerySet phù hợp với tiêu chí tra cứu.

Ví dụ, sau đây

Entry.objects.filter(pub_date__year=2006) 

tương đương với

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

có nghĩa là bộ lọc() là hoạt động hơi đắt nếu lớp mô hình có một số lượng lớn của các đối tượng, trong khi get() là cách tiếp cận trực tiếp.

nguồn: Django making queries

Các vấn đề liên quan