Сигнал Django pre_save: проверить, создан ли экземпляр, не обновлен, существует ли kwargs ['made'] (все еще)? - PullRequest
20 голосов
/ 31 августа 2010

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

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

Ответы [ 4 ]

34 голосов
/ 26 августа 2012

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

20 голосов
/ 31 августа 2010

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

12 голосов
/ 29 июля 2015

Я не уверен, что это рекомендуемый способ, но метод @ 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"

Ссылка: Джанго: Какова роль ModelState?

1 голос
/ 03 октября 2015

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

...