The Python Oracle

Django pre_save signal: check if instance is created not updated, does kwargs['created'] (still) exist?

--------------------------------------------------
Rise to the top 3% as a developer or hire one of them at Toptal: https://topt.al/25cXVn
--------------------------------------------------

Music by Eric Matyas
https://www.soundimage.org
Track title: Puzzle Game Looping

--

Chapters
00:00 Django Pre_save Signal: Check If Instance Is Created Not Updated, Does Kwargs['Created'] (St
01:01 Accepted Answer Score 31
01:20 Answer 2 Score 70
01:34 Answer 3 Score 27
02:00 Answer 4 Score 4
02:12 Thank you

--

Full question
https://stackoverflow.com/questions/3607...

--

Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...

--

Tags
#python #django #keywordargument

#avk47



ANSWER 1

Score 70


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




ACCEPTED ANSWER

Score 31


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.




ANSWER 3

Score 27


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:
        # 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?




ANSWER 4

Score 4


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.