Django pre_save signal: проверить, не создан ли экземпляр экземпляра, существует ли kwargs ['created'] (все еще)?

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

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

Ответы

Ответ 2

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

Ответ 3

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

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

@receiver(pre_save, sender=YourModelName, weak=False, )
def presave_payment_model_check(sender, instance=None, created=False, **kwargs):
    #Reference: /questions/288618/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?

Ответ 4

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