Python django或postgresql的缓存问题
我遇到一个问题,即我的生产服务器为查询显示了不正确的结果(创建和删除已正确说明,但未更新影响结果的现有字段)。我假设这是一个日期比较问题,并花了几个小时进行调试,因为我无法在dev上重现错误。最终,我重新启动了gunicorn,问题消失了。似乎postgresql或django正在缓存queryset结果。我没有设置缓存,所以不理解为什么会发生这种情况 我有两个问题:Python django或postgresql的缓存问题,python,django,postgresql,Python,Django,Postgresql,我遇到一个问题,即我的生产服务器为查询显示了不正确的结果(创建和删除已正确说明,但未更新影响结果的现有字段)。我假设这是一个日期比较问题,并花了几个小时进行调试,因为我无法在dev上重现错误。最终,我重新启动了gunicorn,问题消失了。似乎postgresql或django正在缓存queryset结果。我没有设置缓存,所以不理解为什么会发生这种情况 我有两个问题: 谁在做缓存 我怎样才能禁用它我需要询问一下 要在每次调用时进行评估 设置 Python 2.7 Django 1.7 Postg
class EventList(ListView, FilterMixin):
model = Listing
queryset = Listing.events.order_by('-from_date', )
models.py摘录
class Listing(models.Model):
title = models.CharField(max_length=200, null=True)
to_date = models.DateTimeField(null=True, blank=True)
from_date = models.DateTimeField(null=True, blank=True)
events = EventManager()
event = models.ForeignKey('Event', related_name='listings', null=True, blank=True, on_delete=models.SET_NULL)
class EventManager(models.Manager):
def get_queryset(self):
now = arrow.now()
# Only listings which have events ending after today
qry = super(EventManager, self).get_queryset().filter(event__isnull=False).select_related('event').filter(to_date__gte=now.datetime)
return qry
如果没有添加任何缓存层,Django就不可能有缓存。它不是从Django的盒子里出来的。你必须从别处寻找问题的根源。根据您给出的部分代码,不可能推测可能的原因 尝试找出您的开发服务器和生产服务器之间的差异,只有这样才能为您提供确定问题的初步线索
这些是可以用来找出根本原因的一般策略 如果没有添加任何缓存层,Django不可能有缓存。它不是从Django的盒子里出来的。你必须从别处寻找问题的根源。根据您给出的部分代码,不可能推测可能的原因 尝试找出您的开发服务器和生产服务器之间的差异,只有这样才能为您提供确定问题的初步线索
这些是可以用来找出根本原因的一般策略 这似乎是一个导入时间评估问题(正如您所说,在某种程度上是一个日期比较问题) 导入views.py模块后,将计算
EventList
类的queryset
成员。结果是一个QuerySet
实例,它是在导入时计算的。因此,.filter(to_date\u gte=now.datetime)
部分实际上是在当时执行的,因此日期实际上总是相同的(导入时的日期)
调用视图时,django在幕后所做的一切就是将.all()
附加到查询集,以强制对查询进行新的计算。但由于datetime筛选器实际上是在加载模块时计算的,因此它将始终按相同的日期进行筛选。例如,如果您插入日期在服务器重新启动之前的新列表,我希望您获得这些新结果
对于此类需要动态筛选的情况,您应该替代ListPageView.get\u queryset
方法,以强制执行运行时计算:
class EventList(ListView, FilterMixin):
def get_queryset(self):
return Listing.events.order_by('-from_date')
这似乎是一个导入时间评估问题(正如您所说,在某种程度上是一个日期比较问题) 导入views.py模块后,将计算
EventList
类的queryset
成员。结果是一个QuerySet
实例,它是在导入时计算的。因此,.filter(to_date\u gte=now.datetime)
部分实际上是在当时执行的,因此日期实际上总是相同的(导入时的日期)
调用视图时,django在幕后所做的一切就是将.all()
附加到查询集,以强制对查询进行新的计算。但由于datetime筛选器实际上是在加载模块时计算的,因此它将始终按相同的日期进行筛选。例如,如果您插入日期在服务器重新启动之前的新列表,我希望您获得这些新结果
对于此类需要动态筛选的情况,您应该替代ListPageView.get\u queryset
方法,以强制执行运行时计算:
class EventList(ListView, FilterMixin):
def get_queryset(self):
return Listing.events.order_by('-from_date')
请发布您的模型和视图代码。这不太可能是缓存或与数据库有关;更可能是在类或模块级别评估的查询集。但我们不能不看代码就帮不上忙。@DanielRoseman请看更新的问题。我面临的问题是,当一个列表被撤销时,截止日期被设置为今天的前一天,但是queryset(EventManager中的那个)继续返回它,直到gunicorn重新启动。感谢您的帮助PostgreSQL不会缓存结果集。曾经因此,它不是PostgreSQL,除非您运行在可序列化的
事务中并看到一个旧快照,在这种情况下,这是出于设计和您的应用程序的要求。请发布您的模型和查看代码。这不太可能是缓存或与数据库有关的任何内容;更像