Как прочитать файл из хранилища и сохранить как объект 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()
.