我可以跟踪我的模型实例更新历史记录。我不知道如何进一步进行,以便我可以按特定日期/时间回忆实例值。
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_started
和 booking_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)
lte
和gt
是less than or equal to
或greater than
的简写