2015-10-19 7 views
1

У меня есть объект, который имеет значение атрибута. Значение может обновляться еженедельно, например. Понедельник.Обновления объекта django, отслеживание и сравнение изменений

Я хочу иметь возможность отображать значение объекта по количеству недель, например, значение wk35, значение wk36 ... wk40.

Я хочу, чтобы иметь возможность сравнивать исторические ценности и получать процентное изменение.

То, что я не знаю:

Должен ли я создать атрибуты для моего объекта, например,

datecreated DateUpdated (так он содержит окончательное последнее обновление на определенный день) dateedited (так что пользователь может редактировать значение несколько раз в течение дня)

Я понимаю, пользователь может изменить значение несколько раз, но они должны быть в состоянии обновить окончательное редактирование один раз в этот день.

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

Моя модель класса:

class ZoneSubStage(models.Model): 
    zone = models.ForeignKey(Zone) 
    substage = models.ForeignKey(SubStage) 
    value = models.PositiveSmallIntegerField(default=0) 
    slug = models.SlugField(unique=True) 
    history = HistoricalRecords() 
    created = models.DateTimeField(auto_now_add=True) 
    date = models.DateField(null=True)  
+0

Возможный дубликат [атрибут дорожки атрибутов объекта модели django/изменения/изменения по дате] (https://stackoverflow.com/questions/32616559/django-model-object-attribute-track-updates-edits-changes-by -date) – glennsl

ответ

1

Там могут быть некоторые модули сторонних производителей, которые делают это для вас, но мой лучший самогон предложение является таблица регистрации. Если вам нужна запись в журнале, чтобы быть уникальной по дате, вам просто нужно будет изменить метод ZoneSubStage.save() для поиска ZoneSubStageLog по текущей дате, прежде чем просто создать новый (который, я думаю, вам нужно, но уйдет к вам).

from django.db import transaction 

class ZoneSubStage(models.Model): 
    zone = models.ForeignKey(Zone) 
    substage = models.ForeignKey(SubStage) 
    value = models.PositiveSmallIntegerField(default=0) 
    slug = models.SlugField(unique=True) 
    history = HistoricalRecords() 
    created = models.DateTimeField(auto_now_add=True) 
    date = models.DateField(null=True) 

    def __init__(self, *args, **kwargs): 
     super(ZoneSubStage, self).__init__(*args, **kwargs) 
     self.value_original = self.value 

    def save(self, **kwargs): 
     with transaction.atomic(): 
      response = super(ZoneSubStage, self).save(**kwargs) 
      if self.value_original != self.value: 
       zone_log = ZoneSubStageLog() 
       zone_log.zone_sub_stage = self 
       zone_log.value = self.original_value 
       zone_log.save() 
      return response 

class ZoneSubStageLog(models.Model): 
    zone_sub_stage = models.ForeignKey(ZoneSubStage) 
    value = models.PositiveSmallIntegerField(default=0) 
    date = models.DateField(auto_now_add=True) 
0

Это очень широкий/высокий вопрос, но в основном вы должны хранить исторические данные/изменения отдельно от вашей модели.

Думайте об этом так: ваша модель является живым существом и имеет текущее состояние. С регулярными интервалами вы можете взять моментальные снимки этого состояния (данные). Позже вы можете использовать те снимки, которые вы сделали, чтобы собрать вместе историю модели (например, визуализировать, как она изменилась со временем). Это в основном Memento pattern.

Итак, учтите ваши потребности. Какое «разрешение» должно иметь ваш модельный снимок? То есть, следует ли хранить каждую точку данных или всего несколько? Должен ли он хранить каждое отдельное изменение каждым пользователем или просто делать снимок один раз в неделю? Если вы только раз в неделю, как вы сказали, просто запустите задание cron, которое копирует данные модели в другую модель ... или другую базу данных, или вы даже можете записать ее в плоский файл JSON или CSV!

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

С другой стороны, если есть только один или два действительно важных номера для отслеживания с течением времени, вы можете просто создать модель, которая хранит идентификатор исходной модели в качестве внешнего ключа, важные значения чисел и отметка времени.

EDIT: ответ Dotcomly обеспечивает хорошую реализацию, если все, что вы хотите сохранить, это одно значение ZoneSubStage.value.Чтобы лучше отделить журнал от модели, я бы предложил использовать post_save signal, чтобы создать запись в журнале, вместо того, чтобы переопределять метод сохранения моделей.

+0

Я пытаюсь создать приложение Django, которое может заменить файлы excel. На данный момент пользователь предоставляет мне файл excel, предопределенный для каждого нового проекта, и еженедельно представляет обновление. Ячейка, отмеченная в Серый, предопределена и всегда постоянна для каждого проекта. Ячейка, определенная в Green, определяется пользователем один раз в начале проекта. Розовые ячейки должны обновляться еженедельно, а файл отправляется мне еженедельно. Я пытаюсь создать приложение, которое будет хранить все данные и все еженедельные обновления, чтобы я мог отслеживать изменения на еженедельной основе. – BlueTomato

+0

Вот пример файла: https://dl.dropboxusercontent.com/u/6543156/ProjectDjango.xls – BlueTomato

+0

Я создал свои модели и получаю funcionality, поэтому я могу создать новый проект с новыми этапами и подэтажами и добавить новые зоны и редактировать zoneubstage значения. Хотя я сейчас борюсь с еженедельными обновлениями. – BlueTomato