Как прочитать файл из хранилища и сохранить как объект model.FileField?

У меня есть model.FileField:

class MyModel(models.Model):
    myfile = models.FileField()

У меня есть файл по умолчанию на моем хранилище, который я хочу установить по умолчанию после создания экземпляра, поэтому я пытаюсь сделать это с помощью сигнала post_save:

@receiver(post_save, sender=MyModel)
def post_save_mymodel_setup(sender, instance, created, **kwargs):

    if instance and created:
        with open('/path/to/default_file.pdf', 'r') as f:
            fileobj = File(f, name='default_confidential_information_memo.pdf')

            obj = MyModel(myfile=fileobj)
            obj.save()

Однако это приводит к I/O operation on closed file.. Где я ошибаюсь?

Вы создаете новый экземпляр MyModel в своем сигнале вместо того, чтобы заполнить поле. Таким образом, когда экземпляр сохраняется, срабатывает сигнал, создается другой экземпляр, который вызывает другой сигнал, который создает другой экземпляр, и так далее. Вы можете поступить следующим образом:

@receiver(post_save, sender=MyModel)
def post_save_mymodel_setup(sender, instance, created, **kwargs):

    if instance and created:
        with open('asd.py', 'r') as f:
            fileobj = File(f, name='default_file.pdf')

            instance.myfile = fileobj
            instance.save()

Но лучшей практикой является заполнение этого поля переопределенным методом MyModel.save().

Вернуться на верх