Ошибка рекурсии, вызванная методом __init__
У меня есть модель Folder, которая имеет ForeignKey, ссылающийся на себя, чтобы представить структуру папок :
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}'
Проблема в том, что при удалении папки, имеющей дочерние папки, возникает ошибка рекурсии. Я смог определить, что она возникает из-за метода filepath
, вызываемого в методе __init__
. Однако я не понимаю, почему это происходит, поскольку я не очень понимаю, как работает метод __init__
.
Буду рад, если кто-нибудь поможет мне понять, как я могу решить эту проблему, так как в настоящее время я не знаю, что делать.
Вот взгляд на бесконечный след :
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**
Когда возникает ошибка рекурсии, у меня появляется длинное сообщение (слишком длинное, чтобы я мог изложить его полностью), в котором я обнаружил, что :
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))