从模型内部获取字段值 class

Get field value from inside the model class

我有一个文件夹 class,它在实例化时创建一个文件夹,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 管理页面时,创建文件夹没有问题,但是如果我尝试修改它,在 parent_folder 的不同选择中,有文件夹本身,如果我 select 它会导致错误,因为它会尝试在自身内部重命名。

然后我的目标是从我可以移动它的文件夹列表中删除该文件夹。我尝试使用 FilePathField 的 match 属性,但我没有设法获得实例的 folder_name 的值(以匹配任何不包含我要移动的文件夹名称的文件夹。

因此,如果您能帮助我获取实例的 folder_name 的值,将不胜感激!

我终于找到了一个解决方案,它要求我修改我的文件夹字段,因此它并没有真正回答我最初的问题,但它解决了我的问题,所以我把它放在这里以防万一可以帮助别人。

所以基本上,我将 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)

现在我的文件夹采用外键形式,我可以修改查询集并通过覆盖 render_change_form[=19 将文件夹本身从可用文件夹列表中排除=] 方法,像这样:

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)