Django 实例更新并调用历史记录中的值



我可以跟踪我的模型实例更新历史记录。我不知道如何进一步进行,以便我可以按特定日期/时间回忆实例值。

class Room用于创建新聊天室。
class RoomLog用于跟踪更改。如果我更新房间实例,则会创建相关的房间日志实例。它会影响为每个房间实例更新创建房间日志实例。

因此,我可以在一分钟或一小时内多次更改特定实例。我可以同时对其他实例执行相同的操作,或者例如,我可以不更改任何实例或更改其他一些实例,而不更改所有实例。

虽然

我想按特定小时/天或特定时间段内回忆整个表格,其中包含实例的所有最新值,例如

如果我选择凌晨 1:00 的时间,则呈现 Table 时会使用此时创建的所有实例。我们称之为表 v0。

现在我开始更新,有些实例在凌晨 1:00 和凌晨 2:00 之间发生了变化。因此,我想重新调用一个表,该表显示凌晨 2:00 的所有实例,并及时记住某些实例已更改但有些实例未更改。因此,其中一些有变化的历史,有些则没有。

其他小时/天也是如此。我希望你能理解我想要实现的目标。

怎么做?

这是我用来在 Room 和相关 RoomLog 实例上运行的两个模型。

class Room(models.Model):
    room_name = models.CharField(max_length= 10)
    room_value = models.PositiveSmallIntegerField(default=0)
    flat = models.ForeignKey(Flat)
    created_date = models.DateField(auto_now_add= True)
    created_time = models.TimeField(auto_now_add= True)
    def __init__(self, *args, **kwargs):
        super(Room, self).__init__(*args, **kwargs)
        self.value_original = self.room_value
    def save(self, **kwargs):
        with transaction.atomic():
            response = super(Room, self).save(**kwargs)
            if self.value_original != self.room_value:
                room_log = RoomLog()
                room_log.room = self   
                room_log.room_value = self.value_original
                room_log.save()
            return response
    class Meta:
        ordering = ('room_name',)
    def __unicode__(self):
        return self.room_name

class RoomLog(models.Model):
    room = models.ForeignKey(Room)
    room_value = models.PositiveSmallIntegerField(default=0)
    update_date = models.DateField(auto_now_add= True)
    update_time = models.TimeField(auto_now_add= True)
    def __str__(self):
        return '%s | %s | %s' % (self.room, self.update_date, self.update_time)

编辑

下面DJQ关于GT和LTE的回答为我指出了一个解决方案。 这就是我在我的观点中解决它的方式:

class AllRoomsView(ListView):
    template_name = 'prostats/roomsdetail.html'
    queryset = Room.objects.all()

    def get_context_data(self, **kwargs):
        context = super(AllRoomsView, self).get_context_data(**kwargs)
        timenow = tz.now()
        timeperiod= timedelta(hours=1)
        deltastart = timenow - timeperiod
        context['rooms'] = Room.objects.all()
        context['rlog'] = RoomLog.objects.all()
        context['rfiltered'] = RoomLog.objects.filter(update_time__gt = deltastart)
        context['rfilteredcount'] = RoomLog.objects.filter(update_time__gt = deltastart).count()
        print timenow
        choosestart = '22:04:30.223113'
        choosend = '22:54:30.223113'
        context['roomfiltertest'] = RoomLog.objects.filter(update_time__gt = choosestart, update_time__lte = choosend)
        return context

您应该能够按时间范围筛选模型。使用DateTimeField可能会更容易。下面是如何按时间范围进行筛选的示例(假设 DateTimeField ,以及字段 booking_startedbooking_ended 的模型结构略有不同(

from datetime import timedelta
from django.utils import timezone as tz
start = tz.now()
time_range = timedelta(hours=2)
end = start - time_range
Room.objects.filter(booking_started__lte=start, booking_ending__gt=end)

ltegtless than or equal togreater than的简写

最新更新