2016-07-27 27 views
0

當在Django中使用基於類的通用視圖時,具有queryset屬性意味着「限制」視圖將操作的對象集合,對吧?Django:試圖瞭解queryset屬性如何在基於類的通用視圖中工作

如果提供queryset,則該queryset將用作對象的來源。 (Django's get_object()

型號:

from django.db import models 

class Person(models.Model): 
    full_name = models.CharField(max_length=30) 
    is_active = False 

查看:

from django.views.generic import DetailView 
from books.models import Person 

class PersonDetail(DetailView): 
    queryset = Person.objects.filter(is_active=True) 

queryset上述確保只考慮對象與is_active=true

但是,這是如何工作內部?

例如:Django是否將SQL條件AND is_active=TRUE附加到視圖中的每個查詢?

確定最後一個例子看起來很愚蠢,但我希望你能明白我的問題。謝謝。

+1

「* Django是否將視圖*中的每個查詢添加了SQL條件AND is_active = TRUE。對,就是這樣。然後它[應用額外的過濾器來縮小到特定的對象](https://github.com/django/django/blob/master/django/views/generic/detail.py#L38)。 – solarissmoke

+0

@solarissmoke感謝您的評論。如果你制定答案,我會很高興接受它:) – gglasses

回答

2

是的,這正是發生的情況。您的查詢集被視圖的get_object方法用作基本查詢集。然後,它施加additional filter得到一個特定的對象(例如,通過ID):

queryset = queryset.filter(pk=pk) 

當然,視圖需要一個單一的對象,而不是一個查詢集,所以然後它的作用:

obj = queryset.get() 

這將返回單個對象,或者返回DoesNotExistMultipleObjectsReturned異常。 DoesNotExist結果爲404. MultipleObjectsReturned未處理並將傳播到您的代碼。