在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
附加到视图中的每个查询中?
好的,最后一个例子看起来很愚蠢,但我希望你能理解我的问题。谢谢。
答案 0 :(得分:2)
是的,这正是发生的事情。您的查询集被视图的get_object
方法用作基本查询集。然后,它应用additional filter来获取特定对象(例如,通过ID):
queryset = queryset.filter(pk=pk)
当然,视图需要单个对象,而不是查询集,因此它会:
obj = queryset.get()
将返回单个对象,或DoesNotExist
或MultipleObjectsReturned
例外。 DoesNotExist
会产生404. MultipleObjectsReturned
未处理,会传播到您的代码。