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

#django #django-models

Вопрос:

У меня есть 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_file.pdf')

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

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

Ответ №1:

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

 @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() методом.