2016-04-13 3 views
0

У меня есть модель:Джанго: отслеживание, если поле в модели изменяется

class Object(Object1): 
    name = models.CharField(max_length=255, blank=True) 
    description = models.TextField(blank=True) 
    date_updated = models.DateTimeField(blank=True, null=True) 

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

Например:

if date_updated: 
    MyModel.objects.create(type="D", user=request.user) 

Хотя я пытался this, но до сих пор нет успеха.

+0

«не отменяя сохранить метод» - почему у вас есть это требование? – alecxe

+0

Не могли бы вы также добавить код, который вы пробовали? – AKS

+1

Вы считаете использовать сигнал 'post_save'? – karthikr

ответ

0

Извините, только что заметили, что вы ссылаетесь на request.user. Так что это НЕ будет работать для вас. Поскольку вам нужен конкретный объект request, его, вероятно, лучше всего сделать в представлении, на которое ссылается объект request.

С помощью pre_save вы можете сравнить значение свойства текущего экземпляра с текущим в базе данных.

@receiver(pre_save, sender=MyModel) 
def check_date(sender, instance=None, created=False, **kwargs): 
    changed = created or instance.date_updated != MyModel.objects.get(pk=instance.pk).date_updated 

    if changed: 
     MyModel.objects.create(type="D", user=request.user) 

Не проверял его.

+0

не могли бы вы привести пример того, как это сделать в моем случае? потому что я много пробовал до сих пор. –

+0

Могу ли я получить пользователя от kwargs здесь? –

0

Вы можете использовать поле tracker от django-model-utils.

Добавить трекер модели:

class Object(Model): 
    name = models.CharField(max_length=255, blank=True) 
    description = models.TextField(blank=True) 
    date_updated = models.DateTimeField(blank=True, null=True) 

    tracker = FieldTracker() 

Вы можете проверить в save() или в других местах, где вы обычно обновления модели:

if object.tracker.has_changed('date_updated'): 

    create_new_object(data) 
Смежные вопросы