【问题标题】:How do I save FileField using model's id in Django如何在 Django 中使用模型的 ID 保存 FileField
【发布时间】:2020-10-27 13:40:04
【问题描述】:

我创建了一个上传函数,它使用 pk 或 id 保存上传的文件。

但是我在instance.id 中得到了一个 None 作为文件夹。我按照post 上的说明进行操作,发现如果您使用的是 id,则需要确保在上传文件之前保存模型实例。否则,此时id还没有设置,无法使用。

如何获取 id 而不是 None..?

我想将上传的文件保存到“media/id/uploaded_file”

上传至功能

def upload_to(instance, filename):
    print('ID', instance.pk)
    return os.path.join(str(instance.id), filename)

我的模型.py

class MyVideo(models.Model):
    videofile= models.FileField(upload_to=upload_to)
    name= models.CharField(max_length=500)
    date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name + ": " + str(self.videofile)

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    在运行object.save()之前没有办法猜测主键,所以第一次保存对象时不能使用对象id。 主键是由数据库选择的,而不是 django - 在保存之前,django 不知道主键是什么。

    我曾想过在 upload_to 函数中运行 instance.save(),但那行不通 - 你会陷入无限循环。

    如果您确实需要使用 pk 作为文件夹名称,请首先使用 null videofile 保存对象(不是在 upload_to 函数中,而是在模型之外的某个地方 - 在视图或序列化程序中)(您可能必须制作此字段可以使用videofile= models.FileField(null=True, upload_to=upload_to)) 为空,然后在保存后用文件更新它。但是它不是最理想的,您需要两次数据库命中。

    您还可以使用某种散列函数来生成您自己的、可预测的主键,而不是使用整数。

    【讨论】:

    • 感谢回复,我想我必须使用模型中的一个字段来保存我的文件字段
    猜你喜欢
    • 1970-01-01
    • 2010-09-27
    • 2011-01-14
    • 2011-12-12
    • 2020-02-07
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多