Python 如何从带有变更日志的表和Django中的事件表中获取可以推迟到给定日期的事件?

Python 如何从带有变更日志的表和Django中的事件表中获取可以推迟到给定日期的事件?,python,django,postgresql,Python,Django,Postgresql,我被困在一个场景中,我正在制作一个API,返回给定月份和年份组合中的事件 数据库结构: 事件-包含事件的基本详细信息。 EventLog-具有事件的外键、起始日期和截止日期 创建事件时,会在事件表和事件日志表中创建一个条目(from_date设置为null) 延迟事件时,会在事件日志中输入上一个日期和当前日期 现在给定一个日期,我想显示在那个日期发生的事件,以及推迟的事件,以及应该在那个日期发生的最新日期 如何在不调用太多数据库的情况下进行操作?如果没有其他EventLog表的用途,只需将条目放

我被困在一个场景中,我正在制作一个API,返回给定月份和年份组合中的事件

数据库结构:

事件
-包含事件的基本详细信息。
EventLog
-具有
事件的外键、起始日期和截止日期

创建事件时,会在事件表和事件日志表中创建一个条目(from_date设置为null)

延迟事件时,会在事件日志中输入上一个日期和当前日期

现在给定一个日期,我想显示在那个日期发生的事件,以及推迟的事件,以及应该在那个日期发生的最新日期


如何在不调用太多数据库的情况下进行操作?

如果没有其他
EventLog
表的用途,只需将条目放入
entries
表中,并在其中输入执行日期即可。如果日期被推迟,则更新
事件
表本身中的执行日期


这还假设您不需要以前的日期(因为您的要求是只需要显示当天发生的事件)

类似这样的内容,您可以在一个查询中获得所有事件

EventLog.objects.filter((Q(from_date=None) & Q(event__date=mydate)) | Q(from_date=mydate)).select_related('event')

如果EventLog的目的是跟踪事件开始日期和结束日期随时间的变化,那么您应该始终将当前日期存储在事件表中,并在EventLog中记录更改

当事件延期时,日期在事件中更改,并在事件日志中注明

然后您的查询如下所示:

current_events = Event.objects.filter(from_date__lte=now, to_date__gte=now)
postponed_events = Event.objects.exclude(from_date__lte=now, to_date__gte=now).filter(logs__from_date__lte=now, logs__to_date__gte=now)
all_events = current_events + postponed_events
在您的事件模型中:

class Event(models.Model):
    ...
    from_date = ...
    to_date = ...

    def postpone(self, from_date, to_date):
        EventLog.objects.create(event=self, from_date=self.from_date, to_date=self.to_date)
        self.from_date = from_date
        self.to_date = to_date
        self.save()

我知道,通过将“开始日期”和“结束日期”存储两次似乎是在复制数据,但实际上并非如此,特别是如果您仅使用EventLog存储更改而不是当前时间。

我需要跟踪事件日期的更改。所以我必须记录。我如何获得活动的最新日期?该事件可能被推迟了多次。因此,事件日志对每个事件都有多个条目?是的,每次都会推迟。感谢您的回答,但我通过为每个事件的事件日志注释max to_date和max from_date来逃脱。简而言之,是一种按事件分组的方式,包括最大形式日期和最大截止日期以及其他事件详细信息。但最大自日期和最大截止日期是否始终是正确的日期?