Я использую сигнал Django pre_save для реализации auto_now_add. В Интернете много обсуждается, почему вы должны или не должны реализовывать это самостоятельно. Я не ценю комментарии по этому поводу. Ни о том, должен ли я переписывать функцию сохранения (у меня есть много моделей, которые используют auto_now_add, поэтому использование сигналов имеет смысл).

Мой вопрос:
Я хотел бы проверить, создан ли экземпляр или обновлен. Согласно некоторым источникам в Интернете, это можно сделать, протестировав, если kwargs['created'] имеет значение True. Однако 'created' не отображается в моем kwargs, хотя экземпляр только что создан. Мне было просто интересно, существовало ли оно когда-либо или что оно исчезло волшебным образом. Я знаю, что мог бы также проверить, установлен ли kwargs['instance'].id (это на самом деле работает для меня), но я хотел бы знать, существует ли еще kwargs ['create'].

27
Heyl1 31 Авг 2010 в 13:09

5 ответов

Лучший ответ

Согласно последней документации Django, pre_save НЕ отправляет аргумент created. Post_save однако делает. Я не смог найти ссылку на отправку сигнала created, так как версия 1.0.

20
Manoj Govindan 31 Авг 2010 в 09:20

Обновление 2020

Я не знаю, с какой версии это возможно, но теперь вы можете напрямую использовать created из аргументов, отправленных с сигналом

https://docs.djangoproject.com/en/3.0/ref/signals/#post-save

0
Zat42 23 Фев 2020 в 23:50

Использование instance._state.adding является наиболее логичным подходом, так как вы сможете сказать, что состояние модели существует или является новым, независимо от того, был ли назначен первичный ключ или нет.

2
Timothy Mugayi 3 Окт 2015 в 04:32

Я не уверен, что это рекомендуемый способ, но метод @ Radagast у меня не сработал (не уверен, что это так, потому что я использую пользовательские ПК).

Я попробовал следующее (не уверен, что это лучший способ):

@receiver(pre_save, sender=YourModelName, weak=False, )
def presave_payment_model_check(sender, instance=None, created=False, **kwargs):
    #Reference: https://stackoverflow.com/questions/11561722/django-what-is-the-role-of-modelstate
    if instance._state.adding is True:
        # we would need to create the object
        print "Creating an object"
    else:
        #we are updating the object
        print "Updating an object"

Ссылка: Django: Какова роль ModelState?

16
Community 23 Май 2017 в 12:09

Атрибут первичного ключа обычно назначается базой данных при первом сохранении экземпляра. Таким образом, вы можете использовать что-то вроде if instance.pk is None

39
Radagast 26 Авг 2012 в 17:32