 <p>By calling both the _breadcrumb method with x.father and assigning x = x.father in the beginning of the while loop you jump over one father. Try exchanging </p> <pre><code>self.crumb = self._breadcrumb(father) </code></pre> <p>with</p> <pre><code>self.crumb = self._breadcrumb(self) </code></pre> <p>By defining _breadcrumb within the model class you can clean it up like this:</p> <pre><code>class GeoObject(models.Model): name = models.CharField('Name',max_length=30) father = models.ForeignKey('self', related_name = 'geo_objects') crumb = PickledObjectField() # more attributes... def _breadcrumb(self): ... return breadcrumb def save(self,*args, **kwargs): self.crumb = self._breadcrumb() super(GeoObject, self).save(*args,**kwargs) </code></pre> <p>For more complex hierachies I recomend <a href="https://tabo.pe/projects/django-treebeard/docs/tip/" rel="nofollow noreferrer">django-treebeard</a> </p>