Django:试图理解queryset属性在基于类的通用视图中的工作原理

时间:2016-07-27 04:31:51

标签: python django generics

在Django中使用基于类的通用视图时,拥有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 个答案:

答案 0 :(得分:2)

是的,这正是发生的事情。您的查询集被视图的get_object方法用作基本查询集。然后,它应用additional filter来获取特定对象(例如,通过ID):

queryset = queryset.filter(pk=pk)

当然,视图需要单个对象,而不是查询集,因此它会:

obj = queryset.get()

将返回单个对象,或DoesNotExistMultipleObjectsReturned例外。 DoesNotExist会产生404. MultipleObjectsReturned未处理,会传播到您的代码。