title: Overridden save() method behavior not using super().save() method
body: <p>I have a model with a customized save() method that creates intermediate models if the conditions match:</p>
  
  <pre><code>class Person(models.Model):
      integervalue = models.PositiveIntegerField(...)
      some_field = models.CharField(...)
      related_objects = models.ManyToManyField('OtherModel', through='IntermediaryModel')
      ...
      def save(self, *args, **kwargs):
          if self.pk is None: # if a new object is being created - then
              super(Person, self).save(*args, **kwargs) # save instance first to obtain PK for later
              if self.some_field == 'Foo': 
                  for otherModelInstance in OtherModel.objects.all(): # creates instances of intermediate model objects for all OtherModels
                      new_Intermediary_Model_instance = IntermediaryModel.objects.create(person = self, other = otherModelInstance)
          super(Person, self).save(*args, **kwargs) #should be called upon exiting the cycle
  </code></pre>
  
  <p>However, if editing <strong>an existing</strong> Person both through shell and through admin interface - if I alter integervalue of some existing Person - the changes are not saved. As if for some reason last super(...).save() is not called.</p>
  
  <p>However, if I were to add else block to the outer if, like:</p>
  
  <pre><code>        if self.pk is None:
              ...
          else:
              super(Person, self).save(*args, **kwargs)
  </code></pre>
  
  <p>the save() would work as expected for existing objects - changed integervalue is saved in database.</p>
  
  <p>Am I missing something, or this the correct behavior? Is "self.pk is None" indeed a valid indicator that object is just being created in Django?</p>
  
  <p><strong>P.S.</strong> I am currently rewriting this into signals, though this behavior still puzzles me.</p>