2016-07-27 26 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未处理并将传播到您的代码。