Python 重写get_queryset会导致ListView中的缓存问题,因为在ListView中数据仍然过时

Python 重写get_queryset会导致ListView中的缓存问题,因为在ListView中数据仍然过时,python,django,django-templates,django-queryset,Python,Django,Django Templates,Django Queryset,有人能解释一下为什么重写get_queryset并通过self引用queryset会完全缓存页面吗?我需要等待5分钟或更长时间才能更新数据库显示 我试图将临时值保存到每个对象,并将其传递到模板 在例3中,我已经让所有的东西都很好地工作了,但是我真的不明白我做了什么来让它工作,所以任何洞察都是很好的 示例1:缓存几分钟,但r.css='abc'工作正常 class AppointmentListView(ListView): qs=预约.对象.预回迁相关('客户','患者') def get_qu

有人能解释一下为什么重写
get_queryset
并通过
self
引用queryset会完全缓存页面吗?我需要等待5分钟或更长时间才能更新数据库显示

我试图将临时值保存到每个对象,并将其传递到模板

在例3中,我已经让所有的东西都很好地工作了,但是我真的不明白我做了什么来让它工作,所以任何洞察都是很好的

示例1:缓存几分钟,但r.css='abc'工作正常
class AppointmentListView(ListView):
qs=预约.对象.预回迁相关('客户','患者')
def get_queryset(自我):
对于self.qs中的r:

r、 css='abc'#您看到的行为是Python如何评估代码的。下面是一个简单的例子来解释你所看到的

import random

class Example1(object):
    roll = random.randint(1, 6) # this is evaluated immediately!
    def get_roll(self):
        return self.roll

ex1 = Example1()

# the call below always returns the same number! 
# (until Python re-interprets the class)
ex1.get_roll() 
如果在python解释器中键入上述代码,您会注意到
ex1.get\u roll()
总是返回相同的数字

Example1.roll
被称为类或静态变量。定义类时,这些值仅计算一次

class Example2(object):
    def get_number(self):
        roll = random.randint(1,6)
        return roll
Example2
中,每次调用
get\u roll
方法时都会生成一个新的随机数

对于问题中列出的示例:

示例1

qs
是一个类变量,因此只计算一次(这就是为什么您会看到“缓存”行为)。对
get\u queryset
的后续调用返回最初计算的相同
qs
变量

示例2

您没有覆盖
get\u queryset
,这意味着
ListView。将使用get\u queryset
实现

Django的
ListView.get_queryset
在对其求值之前复制
queryset
——这就是为什么您看不到“缓存”。但是,由于queryset被复制,因此for循环的效果被丢弃

示例3

这通常是编写代码的正确方法。如果不想看到“缓存”行为,应该这样编写方法

class AppointmentListView(ListView):

    def get_queryset(self):
        qs = Appointment.objects.prefetch_related('client','patients')
        for r in qs:
            r.css = 'abc' #<-passes to template ok

        return qs
import random

class Example1(object):
    roll = random.randint(1, 6) # this is evaluated immediately!
    def get_roll(self):
        return self.roll

ex1 = Example1()

# the call below always returns the same number! 
# (until Python re-interprets the class)
ex1.get_roll() 
class Example2(object):
    def get_number(self):
        roll = random.randint(1,6)
        return roll