是否有與結果的差異:MyModel.objects.filter(pk = 1)和MyModel.objects.get(pk = 1)之間有區別嗎?
MyModel.objects.filter(pk=1)
和
MyModel.objects.get(pk=1)
如果沒有差異,那麼爲何獲得()方法存在嗎?
是否有與結果的差異:MyModel.objects.filter(pk = 1)和MyModel.objects.get(pk = 1)之間有區別嗎?
MyModel.objects.filter(pk=1)
和
MyModel.objects.get(pk=1)
如果沒有差異,那麼爲何獲得()方法存在嗎?
.get()總是返回該對象(如果存在的話)(並且如果只有一個)。如果它不存在,它也會引發異常。例如
blah = MyModel.objects.get(pk=1)
blah是MyModel的一個實例。 .filter()另一方面不會返回一個錯誤,如果它不存在。
blah = MyModel.objects.filter(pk=1234234234)
然後blah是一個空的查詢。你可以在blah上調用.count()來檢查它。如果blah.count()== 0意味着與關鍵1234234234.同樣沒有爲MyModel的項目,如果有許多項目與查詢說:
blah = MyModel.objects.filter(name__contains="Brian")
的你可以interated查詢結果在得到每個結果:
for b in blah:
print b.name
此外,另一個有趣的方法simular來獲得()是.get_or_create()http://www.djangoproject.com/documentation/models/get_or_create/有了這個,你可以說:
blah,created = MyModel.objects.get_or_create(name="Brian Ray",
cool=False,
fun=True)
有
若已是通常使用.get()返回的BrianRay,它只是返回該實例;否則,它會創建它。注意它返回兩件事。第二個只是一個標誌,讓來電者知道實際發生了什麼。
HTH,布賴恩·雷
過濾器返回MyModels列表(在本例中爲一個列表)。獲取返回MyModel的一個實例。
順便說一句:您可以通過運行測試這些東西:
manage.py shell
from myapp import models
models.MyModel.objects.filter(pk=1)
models.MyModel.objects.get(pk=1)
看,它的輸出。
還要注意的是'GET'拋出對象時沒有找到'DoesNotExist'異常並拋出時,有不止一個'MultipleObjectsFound'例外。另一方面,「過濾器」在前一種情況下返回空列表,並明顯處理後一種情況。 – 2009-12-07 23:56:43