Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Механизмы отслеживания изменений модели. [RSS Feed]

#1 Авг. 7, 2012 11:25:38

Dr.Livsi
От:
Зарегистрирован: 2010-02-15
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

Механизмы отслеживания изменений модели.

Добрый день!
Есть система, в которой есть несколько десятков пользователей.
Эти несколько десятков пользователей редактируют одну модель, которая содержит несколько десятков тысяч строк.
Модель:
name1=CharField()
name2=CharField()
name1cat=ForeignKey(cat1)
name2cat=ForeignKey(cat2)

Нужна система, которая бы отслеживала какие пользователи какие именно корректировки внесли в модель (значения до внесения корректировок, значения после внесения, время корректировок).
Не хочется изобретать велосипед, поэтому хотелось бы спросить: существуют ли уже какие-то готовые системы, приложения для реализации данной задачи?



Отредактировано Dr.Livsi (Авг. 7, 2012 11:26:44)

Офлайн

#2 Авг. 7, 2012 11:41:09

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Механизмы отслеживания изменений модели.

https://docs.djangoproject.com/en/dev/ref/models/instances/#what-happens-when-you-save

Можете посмотреть на код:
https://github.com/sunlightlabs/django-gatekeeper/ или
https://bitbucket.org/rajeesh/django-monitor/



Отредактировано fata1ex (Авг. 7, 2012 11:45:05)

Офлайн

#3 Авг. 7, 2012 13:29:52

asava
От: Минск
Зарегистрирован: 2012-07-31
Сообщения: 2
Репутация: +  1  -
Профиль   Отправить e-mail  

Механизмы отслеживания изменений модели.

Добрый день,

Видимо речь идет о контроле версий, советую посмотреть django-reversion Мощная штука аналогов раньше не было

Отредактировано asava (Авг. 7, 2012 13:33:58)

Офлайн

#4 Авг. 7, 2012 17:04:15

Dr.Livsi
От:
Зарегистрирован: 2010-02-15
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

Механизмы отслеживания изменений модели.

fata1ex, asava спасибо. К сожалению, прямо сейчас нет возможности посмотреть, но вечером обязательно изучу эти варианты.



Офлайн

#5 Сен. 1, 2012 14:05:51

Dr.Livsi
От:
Зарегистрирован: 2010-02-15
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

Механизмы отслеживания изменений модели.

asava
нет, речь не о контроле версий



Офлайн

#6 Сен. 2, 2012 16:55:50

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Механизмы отслеживания изменений модели.

Dr.Livsi
Добрый день!
Есть система, в которой есть несколько десятков пользователей.
Эти несколько десятков пользователей редактируют одну модель, которая содержит несколько десятков тысяч строк.
Модель:
name1=CharField()
name2=CharField()
name1cat=ForeignKey(cat1)
name2cat=ForeignKey(cat2)

Нужна система, которая бы отслеживала какие пользователи какие именно корректировки внесли в модель (значения до внесения корректировок, значения после внесения, время корректировок).
Не хочется изобретать велосипед, поэтому хотелось бы спросить: существуют ли уже какие-то готовые системы, приложения для реализации данной задачи?
Велосипед получится совсем не сложный. Переопредели save у модели или повешай обработчик на сигнал pre_save или post_save.



Офлайн

#7 Сен. 3, 2012 11:00:35

Dr.Livsi
От:
Зарегистрирован: 2010-02-15
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

Механизмы отслеживания изменений модели.

FishHook
Dr.Livsi
Добрый день!
Есть система, в которой есть несколько десятков пользователей.
Эти несколько десятков пользователей редактируют одну модель, которая содержит несколько десятков тысяч строк.
Модель:
name1=CharField()
name2=CharField()
name1cat=ForeignKey(cat1)
name2cat=ForeignKey(cat2)

Нужна система, которая бы отслеживала какие пользователи какие именно корректировки внесли в модель (значения до внесения корректировок, значения после внесения, время корректировок).
Не хочется изобретать велосипед, поэтому хотелось бы спросить: существуют ли уже какие-то готовые системы, приложения для реализации данной задачи?
Велосипед получится совсем не сложный. Переопредели save у модели или повешай обработчик на сигнал pre_save или post_save.
Да, в принципе, я к этому и пришел было. Но возникло несколько моментов. Если переопределять save - там возникает проблема с передачей userа, который этот save делает (собственно, если кто подскажет - буду благодарен -в будущем пригодится). Далее если делать через сигналы - там тоже не понятно, как в функцию обработчик добавлять информацию о юзере, который делает сохранение. Кроме того, вероятность того, что несколько user-ов будут корректировать один и тот же экземпляр модели очень высока а здесь уже лучше использовать update - а он не вызывает сигнал pre_save или post_save.
собственно, модель, фиксирующая изменения модели, указанной выше выглядит следующим образом:
model Stat(models.Model):
udate=...
user=ForeignKey(User)
name1cat_before=ForeignKey(Модель)
name2cat_before=ForeignKey(Модель)
name1cat_after=ForeignKey(Модель)
name2cat_after=ForeignKey(Модель)
Пока пришел к row sql:
сохранять данные буду в модель “Модель” (если текущие данные отличаются от того, что собираюсь добавить - если отличаются - то перед обновлением забрасываем статистические данные в Stat, а далее обновляем). Делается все в одну транзакцию, что бы заблокировать возможные конкурентные обновления.



Офлайн

#8 Сен. 3, 2012 13:55:43

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Механизмы отслеживания изменений модели.

Dr.Livsi
FishHook
Dr.Livsi
Добрый день!
Есть система, в которой есть несколько десятков пользователей.
Эти несколько десятков пользователей редактируют одну модель, которая содержит несколько десятков тысяч строк.
Модель:
name1=CharField()
name2=CharField()
name1cat=ForeignKey(cat1)
name2cat=ForeignKey(cat2)

Нужна система, которая бы отслеживала какие пользователи какие именно корректировки внесли в модель (значения до внесения корректировок, значения после внесения, время корректировок).
Не хочется изобретать велосипед, поэтому хотелось бы спросить: существуют ли уже какие-то готовые системы, приложения для реализации данной задачи?
Велосипед получится совсем не сложный. Переопредели save у модели или повешай обработчик на сигнал pre_save или post_save.
Да, в принципе, я к этому и пришел было. Но возникло несколько моментов. Если переопределять save - там возникает проблема с передачей userа, который этот save делает (собственно, если кто подскажет - буду благодарен -в будущем пригодится). Далее если делать через сигналы - там тоже не понятно, как в функцию обработчик добавлять информацию о юзере, который делает сохранение. Кроме того, вероятность того, что несколько user-ов будут корректировать один и тот же экземпляр модели очень высока а здесь уже лучше использовать update - а он не вызывает сигнал pre_save или post_save.

update - а он не вызывает сигнал pre_save или post_save
С чего это вы взяли? Вызывает, конечно.

Если переопределять save - там возникает проблема с передачей userа, который этот save делает (собственно, если кто подскажет - буду благодарен -в будущем пригодится).

Вариант “в лоб” - добавить в модель поле user.
Другой вариант

# 
#base CBV View
#
try:
    from threading import local
except ImportError:
    from django.utils._threading_local import local
_thread_locals = local()
class MyBaseView(object):
    def dispatch(self, request, *args, **kw):
        _thread_locals.request = request
        return super(MyBaseView, self).dispatch(request, *args, **kw)
#
#
# View
#
#
class SomeView(MyBaseView, UpdateView):
     pass
#
#
# Model
#
#
model Stat(models.Model):
     name1cat_before=ForeignKey(Модель)
     name2cat_before=ForeignKey(Модель)
     name1cat_after=ForeignKey(Модель)
     name2cat_after=ForeignKey(Модель)
    def save(self, *args, **kwargs):
       user=_thread_locals.request.user



Отредактировано FishHook (Сен. 3, 2012 13:58:21)

Офлайн

#9 Сен. 3, 2012 15:07:13

Dr.Livsi
От:
Зарегистрирован: 2010-02-15
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

Механизмы отслеживания изменений модели.

FishHook
update - а он не вызывает сигнал pre_save или post_save

С чего это вы взяли? Вызывает, конечно.


https://docs.djangoproject.com/en/1.3/topics/db/queries/#topics-db-queries-update

docs.djangoproject.com
Be aware that the update() method is converted directly to an SQL statement. It is a bulk operation for direct updates. It doesn't run any save() methods on your models, or emit the pre_save or post_save signals (which are a consequence of calling save()).



Отредактировано Dr.Livsi (Сен. 3, 2012 15:08:13)

Офлайн

  • Начало
  • » Django
  • » Механизмы отслеживания изменений модели.[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version