【问题标题】:Django: trying to understand how the queryset attribute works in class-based generic viewsDjango:试图了解 queryset 属性在基于类的通用视图中是如何工作的
【发布时间】:2016-11-30 22:07:05
【问题描述】:

在 Django 中使用基于类的通用视图时,拥有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 附加到视图中的每个查询?

好的,最后一个例子看起来很愚蠢,但我希望你能理解我的问题。谢谢你。

【问题讨论】:

标签: python django generics


【解决方案1】:

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

queryset = queryset.filter(pk=pk)

当然,视图需要单个对象,而不是查询集,所以它会这样做:

obj = queryset.get()

这将返回单个对象,或 DoesNotExistMultipleObjectsReturned 异常。 DoesNotExist 导致 404。MultipleObjectsReturned 未处理并将传播到您的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 2020-11-06
    • 2018-02-22
    相关资源
    最近更新 更多