Получение значения поля изнутри класса модели

У меня есть класс Folder, который создает папку при инстанцировании, при этом поле parent_folder является местом, в котором я хочу, чтобы была создана папка.

class Folder(models.Model):
    folder_name = models.CharField(max_length=200, unique=True)
    parent_folder = models.FilePathField(path=r'media/', allow_files=False, allow_folders=True, recursive=True)

    
    def __init__(self, *args, **kwargs):
        super(Folder, self).__init__(*args, **kwargs)
        self.initial_filepath = self.filepath()


    def save(self, *args, **kwargs):

        on_creation = self.pk is None

        if on_creation:
            os.mkdir(self.filepath())   
        else:
            os.rename(self.initial_filepath, self.filepath())

        super(Folder, self).save(*args, **kwargs)

        def filepath(self):
            return os.path.join(self.parent_folder, self.folder_name)

Когда я захожу на страницу Django Admin, при создании папки проблем не возникает, однако если я перехожу и пытаюсь изменить ее, среди различных вариантов родительской_папки есть сама папка, и если я выбираю ее, возникает ошибка, потому что она пытается переименовать внутри себя.

Моя цель - удалить папку из списка папок, в которые я могу ее переместить. Я пытался использовать атрибут match поля FilePathField, но мне не удалось получить значение folder_name моего экземпляра (чтобы соответствовать любой папке, которая не содержит имя папки, которую я перемещаю).

Итак, если бы вы могли помочь мне получить значение folder_name моего экземпляра, я был бы очень признателен!

Я наконец нашел решение, которое потребовало от меня изменить поля Folder, так что это не совсем ответ на мой первоначальный вопрос, но это решило мою проблему, поэтому я поместил его здесь в случае, если это может помочь кому-то еще.

По сути, я изменил поле parent_folder с FilePathField на 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)

Теперь, когда у меня есть мои папки в форме ForeignKey, я могу изменить набор запросов и исключить саму папку из списка доступных папок, переопределив метод render_change_form, следующим образом :

class FolderAdmin(admin.ModelAdmin):    
    fieldsets = [
        (None,            {'fields': ['folder_name']}),
        ('Parent Folder', {'fields': ['parent_folder']}),
    ]
    
    list_display = ('folder_name', '__str__')
    
    def render_change_form(self, request, context, *args, **kwargs):
        context['adminform'].form.fields['parent_folder'].queryset = Folder.objects.exclude(id=context['object_id'])
        return super(FolderAdmin, self).render_change_form(request, context, *args, **kwargs)
Вернуться на верх