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