[Python] Recursion error caused by __init__ method

Discussão em 'Python' iniciado por Stack, Fevereiro 9, 2025.

  1. Stack

    Stack Membro Participativo

    I have a model Folder which has a ForeignKey refering to itself in order to represent a folders structure :

    class Folder(models.Model):
    folder_name = models.CharField(max_length=200)
    parent_folder = models.ForeignKey('self', on_delete=models.CASCADE, blank=True, null=True)

    def __init__(self, *args, **kwargs):
    super(Folder, self).__init__(*args, **kwargs)
    if self.pk is not None:
    self.initial_filepath = self.filepath()

    def filepath(self):
    if not self.parent_folder:
    return f'media/scripts/{self.folder_name}'
    else:
    return f'{self.parent_folder.filepath()}/{self.folder_name}'


    The issue is, when deleting a folder that has childrens in the admin panel, a recursion error occurs. I was able to determine that it was coming from the filepath method called in the __init__ one. However, what I don't understand, is why this is happening as I don't really understand how the __init__ method work.

    Here's a glimpse of the unending traceback:

    Traceback (most recent call last):
    File "C:\Users\stephane.bernardelli\Documents\ScriptsApp\.env\lib\site-packages\django\db\models\fields\related_descriptors.py", line 187, in __get__
    rel_obj = self.field.get_cached_value(instance)
    File "C:\Users\stephane.bernardelli\Documents\ScriptsApp\.env\lib\site-packages\django\db\models\fields\mixins.py", line 15, in get_cached_value
    return instance._state.fields_cache[cache_name]
    KeyError: 'parent_folder'

    During handling of the above exception, another exception occurred:

    **Exact same error repeating till a recursion error occurs**


    And when the recursion error occurs, I have a long message (too long for me to put it entirely) in which I found that :

    File "C:\Users\stephane.bernardelli\Documents\ScriptsApp\src\scripts\models.py", line 21, in __init__
    self.initial_filepath = self.filepath()
    File "C:\Users\stephane.bernardelli\Documents\ScriptsApp\src\scripts\models.py", line 48, in filepath
    if not self.parent_folder:
    File "C:\Users\stephane.bernardelli\Documents\ScriptsApp\.env\lib\site-packages\django\db\models\fields\related_descriptors.py", line 189, in __get__
    has_value = None not in self.field.get_local_related_value(instance)
    File "C:\Users\stephane.bernardelli\Documents\ScriptsApp\.env\lib\site-packages\django\db\models\fields\related.py", line 742, in get_local_related_value
    return self.get_instance_value_for_fields(instance, self.local_related_fields)
    File "C:\Users\stephane.bernardelli\Documents\ScriptsApp\.env\lib\site-packages\django\db\models\fields\related.py", line 764, in get_instance_value_for_fields
    ret.append(getattr(instance, field.attname))


    admin.py

    class FolderAdmin(admin.ModelAdmin):
    fieldsets = [
    (None, {'fields': ['folder_name']}),
    ('Parent Folder', {'fields': ['parent_folder']}),
    ]

    list_display = ('folder_name', 'parent_folder')

    admin.site.register(Folder, FolderAdmin)

    Continue reading...

Compartilhe esta Página