[英]Caching issues with django or postgresql
我的问题是我的生产服务器显示的查询结果不正确(创建和删除已正确说明,但没有更新会影响结果的现有字段)。 我认为这是一个日期比较问题,并花了几个小时进行调试,因为我无法在开发人员上重现该错误。 最终,我重新启动了gunicorn,问题消失了。 似乎是postgresql或django正在缓存queryset结果。 我尚未设置缓存,所以不明白为什么会这样。
我有两个问题:
设定
Python 2.7
的Django 1.7
PostgreSQL的
的Ubuntu
views.py提取
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
这似乎是一个导入时间评估问题(在某种程度上,它是您所说的日期比较问题)。
一旦导入了views.py模块,将对EventList
类的queryset
成员进行评估。 结果是一个QuerySet
实例 ,该实例已在导入时计算。 因此.filter(to_date__gte=now.datetime)
部分实际上是在那时执行的,因此日期实际上总是相同的(导入时的日期)。
调用视图时,所有django在幕后所做的就是将.all()
附加到queryset,以强制对查询进行新的评估。 但是由于datetime过滤器实际上是在加载模块时评估的,因此它将始终按同一日期过滤。 例如,如果您插入日期重新启动服务器之前的新列表,我希望您得到这些新结果!
对于需要动态过滤的此类情况,应改用ListPageView.get_queryset
方法来强制执行运行时评估:
class EventList(ListView, FilterMixin):
def get_queryset(self):
return Listing.events.order_by('-from_date')
如果您尚未添加任何缓存层,则Django不可能进行缓存。 在Django中,它并不是开箱即用的。 您必须在其他地方寻找问题的根本原因。 使用给出的部分代码,无法推测出可能的原因。
尝试找出开发服务器与生产服务器之间的差异,只有这样才能为您提供查明问题的初步线索。
生产服务器是否位于不同的时区?
产品和开发人员的环境以及环境变量有什么区别?
gunicorn重新启动有什么变化?
如果错误再次在生产中浮出水面,则需要多长时间才能重新出现。 您是否可以使用logstash和kibana之类的工具在生产中添加日志事件。
Python语言具有日期时间处理的一些非直观方面。 您可以阅读更多有关它的信息,在这里。 -https : //opensourcehacker.com/2008/06/30/relativity-of-time-shortcomings-in-python-datetime-and-workaround/,Python日期函数错误
这些是可以用来找出根本原因的通用策略。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.