Django 实例更新并从历史中调用值
Django instances updates and recall values from history
我可以跟踪我的模型实例更新历史。我不知道如何进一步进行,所以我可以按特定日期/时间调用实例值。
class Room
用于创建新房间。
class RoomLog
用于跟踪变化。如果我更新 Room 实例,则会创建相关的 RoomLog 实例。它会影响为每个 Room 实例更新创建 RoomLog 实例。
因此,我可以多次更改特定实例,例如一分钟或一个小时。我可以同时对其他实例执行相同的操作,或者例如我可以不更改任何实例或更改其他一些实例而不更改所有实例。
虽然,
我想按特定时间/日期或特定时间段内的实例的所有最新值召回整个 table,例如
如果我选择时间 1:00am,那么 Table 将使用此时创建的所有实例进行渲染。我们称它为 Table v0。
现在我开始更新,一些实例在 1:00am 和 2:00am 之间更改。因此,我想重新调用 table 显示时间 2:00am 的所有实例,并及时了解某些实例已更改但有些实例未更改。因此,其中一些有变化历史,而另一些则没有。
其他时间/天也一样。我希望你能理解我想要实现的目标。
如何做到这一点?
这是我用来操作 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
的缩写
我可以跟踪我的模型实例更新历史。我不知道如何进一步进行,所以我可以按特定日期/时间调用实例值。
class Room
用于创建新房间。
class RoomLog
用于跟踪变化。如果我更新 Room 实例,则会创建相关的 RoomLog 实例。它会影响为每个 Room 实例更新创建 RoomLog 实例。
因此,我可以多次更改特定实例,例如一分钟或一个小时。我可以同时对其他实例执行相同的操作,或者例如我可以不更改任何实例或更改其他一些实例而不更改所有实例。
虽然,
我想按特定时间/日期或特定时间段内的实例的所有最新值召回整个 table,例如
如果我选择时间 1:00am,那么 Table 将使用此时创建的所有实例进行渲染。我们称它为 Table v0。
现在我开始更新,一些实例在 1:00am 和 2:00am 之间更改。因此,我想重新调用 table 显示时间 2:00am 的所有实例,并及时了解某些实例已更改但有些实例未更改。因此,其中一些有变化历史,而另一些则没有。
其他时间/天也一样。我希望你能理解我想要实现的目标。
如何做到这一点?
这是我用来操作 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