2016-02-06 1 views
2

Я могу отслеживать историю обновлений экземпляров модели. Я не знаю, как продолжить дальше, поэтому я могу вспомнить значения экземпляров по конкретной дате/времени.экземпляры Django обновляют и возвращают значения из истории

class Room предназначен для создания новых комнат.
class RoomLog Используется для отслеживания изменений. Если я обновляю экземпляр комнаты, создается соответствующий экземпляр RoomLog. Это влияет на создание экземпляров RoomLog для каждого обновления экземпляра комнаты.

Итак, я могу изменить конкретный экземпляр несколько раз в пределах, например. минуту или час. Я могу сделать то же самое с другими экземплярами в одно и то же время или, например, я просто НЕ могу изменить какой-либо экземпляр или изменить некоторые другие экземпляры и не изменять их все.

Несмотря на то,

Я хотел бы вспомнить всю таблицу со всеми последними значениями экземпляров по конкретному часу/день или в течение определенного периода времени, например,

Если я выберу время 1:00, тогда таблица будет отображаться со всеми созданными вами экземплярами. Назовем его таблицей 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) 

EDIT

ответ ниже от djq о Gt & ЛТР указал мне в направлении решения. так я решил это на своих взглядах:

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 
+0

ноту на model - похоже, что у вас есть 'room_value', определенный дважды - вам может не понадобиться это в' RoomLog', поскольку вы уже определяете связь между двумя моделями с 'room = models.ForeignKey (Room)' – djq

+0

Я бы предложил позвонить ему что-то другое, если оно имеет другую функцию. – djq

+0

исправьте меня, если я ошибаюсь, но я использую room_value в RoomLog, чтобы он мог отслеживать значения, а также время обновления. Имя может вводить в заблуждение, но оно выполняет ту же функцию. Я подумаю об этом, как только выясню свою основную проблему по теме. – BlueDog

ответ

0

Вы должны иметь возможность фильтровать вашу модель по временным диапазонам. Это может быть проще с 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 являются Shorthands для less than or equal to или greater than