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

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

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

Нужна система, которая бы отслеживала какие пользователи какие именно корректировки внесли в модель (значения до внесения корректировок, значения после внесения, время корректировок).
Не хочется изобретать велосипед, поэтому хотелось бы спросить: существуют ли уже какие-то готовые системы, приложения для реализации данной задачи?
Велосипед получится совсем не сложный. Переопредели save у модели или повешай обработчик на сигнал pre_save или post_save.
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.
собственно, модель, фиксирующая изменения модели, указанной выше выглядит следующим образом:
model Stat(models.Model):
udate=...
user=ForeignKey(User)
name1cat_before=ForeignKey(Модель)
name2cat_before=ForeignKey(Модель)
name1cat_after=ForeignKey(Модель)
name2cat_after=ForeignKey(Модель)
Пока пришел к row sql:
сохранять данные буду в модель “Модель” (если текущие данные отличаются от того, что собираюсь добавить - если отличаются - то перед обновлением забрасываем статистические данные в Stat, а далее обновляем). Делается все в одну транзакцию, что бы заблокировать возможные конкурентные обновления.
FishHook
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
Dr.Livsi
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()).
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB