问题
I am using Django's pre_save signal to implement auto_now_add. There is a lot of discussion on the internet on why you should or shouldn't implement it yourself. I do not appreciate comments on this. Neither on whether I should be rewriting the save function (I have a lot of models that use auto_now_add so using signals makes sense).
My question is:
I would like to check if the instance is created or updated. According to some sources on the internet this can be done by testing if kwargs['created']
is True. However 'created'
does not appear in my kwargs
even though the instance is newly created.
I was just wondering if it has ever existed or that it has disappeared magically.
I know I could also test if kwargs['instance'].id
is set (this in fact works for me), but I'd like to know if kwargs['created'] still exists.
回答1:
According to the latest Django documentation, pre_save
does NOT send a created
argument. Post_save
however does. I could not find any reference of the signal sending created
since version 1.0.
回答2:
Primary key attribute usually assigned by the database when the instance saved first time. So you can use something like if instance.pk is None
回答3:
I am not sure if this is the recommended way but @Radagast's method didnt work for me(not sure if its because I use custom Pk's).
I tried the following(not sure if this is the best way):
@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"
Reference: Django : What is the role of ModelState?
回答4:
You can easily check if an instance is created or updated in pre_save in this way:
@receiver(pre_save, sender=MyModel)
def pre_save_user(sender, instance, **kwargs):
if instance._state.adding:
print ('Instance created!')
else:
print ('Instance updated!')
Tested with Django 3.0.
回答5:
Using instance._state.adding is the most logical approach, as you will be able to tell the model state exists or is new, regardless whether the primary key as been assigned or not.
回答6:
Update 2020
I don't know since which version this is possible but you can now directly use created
from arguments sent with signal
https://docs.djangoproject.com/en/3.0/ref/signals/#post-save
来源:https://stackoverflow.com/questions/3607573/django-pre-save-signal-check-if-instance-is-created-not-updated-does-kwargsc