【问题标题】:Django : generate a file then save it in a FileFieldDjango :生成一个文件,然后将其保存在 FileField 中
【发布时间】:2021-08-12 13:41:39
【问题描述】:

我有一个模特Contract。当用户创建一个新的Contract 时,他们只需要提供名称。然后,我的代码将生成一个文件,并将其保存在contract_file 中,即FileField

为此,我有一个生成文件的静态方法,然后我覆盖了django的Modelsave方法。

class Contract(models.Model):
    name = models.CharField(max_length=150, null=True)
    contract = models.FileField(upload_to = 'contrats/', blank=True, null=True)

    def save(self, *args, **kwargs):
        filename = self.generate_contract()
        f = open(filename, "r")
        self.contract.save(filename, f)
        return super(Refund, self).save(*args, **kwargs)

    @staticmethod
    def generate_contract():
        filename = settings.MEDIA_ROOT + 'test.txt'
        f = open(filename, "w")
        f.write("content")
        f.close()
        return filename

不幸的是,这会导致

异常值:调用 Python 对象时超出最大递归深度

我想当我调用 FileField save 方法时,它可能还会以某种方式调用 Contract 的保存方法。但我无法解决这个问题。有没有人有一种方法来执行这个文件生成然后保存它?

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    运行self.contract.save(filename, f)时通过如下图添加save参数。

    这不会运行 Contract 实例保存方法,这会导致您的递归。

    self.contract.save(filename, f, save=False)
    

    我还建议在打开文件时使用with ...,这样它们就不会保持打开状态。如下图:

    def save(self, *args, **kwargs):
        filename = self.generate_contract()
        with open(filename, "r") as f:
            self.contract.save(filename, f)
        return super().save(*args, **kwargs)
    

    【讨论】:

    • 像魅力一样工作。我不知道这个save 参数。
    猜你喜欢
    • 2017-08-02
    • 2021-01-06
    • 2020-08-22
    • 2021-04-25
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    相关资源
    最近更新 更多