gpt4 book ai didi

python - django 或 postgresql 的缓存问题

转载 作者:行者123 更新时间:2023-11-29 12:29:54 25 4
gpt4 key购买 nike

我有一个问题,我的生产服务器显示不正确的查询结果(创建和删除已正确说明,但没有更新影响结果的现有字段)。我认为这是一个日期比较问题,并花了几个小时调试,因为我无法在 dev 上重现错误。最终,我重新启动了 gunicorn,问题就消失了。似乎 postgresql 或 django 正在缓存查询集结果。我没有设置缓存,所以不明白为什么会这样。

我有两个问题:

  1. 谁在做缓存?
  2. 如何禁用它? - 我需要查询集 每次调用时都要评估

设置

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 instance,它是在导入时计算的。所以 .filter(to_date__gte=now.datetime) 部分实际上是在那时执行的,因此日期实际上总是相同的(导入时的日期)。

当 View 被调用时,django 在幕后所做的就是将 .all() 附加到查询集中,以强制对查询进行新的评估。但由于日期时间过滤器实际上是在加载模块时进行评估的,因此它将始终按相同的日期进行过滤。例如,如果您插入服务器重新启动之前的新列表,我希望您能得到这些新结果!

对于像这些需要动态过滤的情况,您应该改写 ListPageView.get_queryset 方法,以强制执行运行时评估:

class EventList(ListView, FilterMixin):
def get_queryset(self):
return Listing.events.order_by('-from_date')

关于python - django 或 postgresql 的缓存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33013597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com