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