【问题标题】:Django: presave signal to get file extension in ModelDjango:presave 信号以获取模型中的文件扩展名
【发布时间】:2019-09-07 05:57:19
【问题描述】:

在 Django 中,对于文件字段,可以在下面的代码中使用可调用例如 user_directory_path

def user_directory_path(instance, filename):
    # file will be uploaded to MEDIA_ROOT/user_<id>/<filename>
    return 'user_{0}/{1}'.format(instance.user.id, filename)

class MyModel(models.Model):
    upload = models.FileField(upload_to=user_directory_path)
extension = models.CharField(max_length=100, null=False, blank=False, default=get_filename_ext)

但是,对于扩展字段,我想使用 get_filename_ext 函数以便保存文件的扩展名。

def get_filename_ext(filepath):
    base_name = os.path.basename(filepath)
    name, ext = os.path.splitext(base_name)
    return name, ext

Django 模型中有类似的东西吗?还是我必须在 Django 视图中执行此操作?

【问题讨论】:

    标签: django view model django-signals


    【解决方案1】:

    保存扩展可能是多余的,因此会导致数据重复。由于数据已经在数据库中,所以存储在upload列中。

    您可以使用some_mymodel.upload.name 检索文件名,从而对其进行进一步处理:

    from os.path import basename, splitext
    
    class MyModel(models.Model):
        upload = models.FileField(upload_to=user_directory_path)
    
        @property
        def extension(self):
            if self.upload:
                return splitext(basename(self.upload.name))[1]

    因此,我们在这里向MyModel 添加一个属性,该属性将从upload 名称中检索扩展名。如果没有文件,则返回None

    【讨论】:

    • 谢谢!如果数据库太大,我想获取所有 jpg 或 png 图像文件,那么我将不得不遍历该表的所有记录来获取我想要的文件,这是我将扩展名保存在单独的列。
    • @asdfkjasdfjk:本身不是,您可以过滤MyModel.objects.filter(upload__endswith='png') 以获取所有.png 文件。
    猜你喜欢
    • 1970-01-01
    • 2010-11-05
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    相关资源
    最近更新 更多