Удалите следующую строку:
if self.invoice_file.count() > 0:
Если вы собираетесь выполнить попадание в базу данных, вы также можете сделать это, получив все файлы, связанные со счетом.Это должно иметь дополнительное преимущество при получении «свежего» представления связанных объектов.
Хотя проблема, вероятно, еще глубже.Поля ManyToMany не могут быть сохранены, пока не будет сохранена содержащая их модель.Пример:
class Post(models.Model):
title = models.CharField(max_length=100)
commenters = models.ManyToManyField(User)
me = User.objects.get(username='Josh')
p = Post(title="ManyToManyExample")
p.commenters.add(me) # error, Post does not yet have an ID.
p.save()
p.commenters.add(me) # success!
Ваше поле invoice_file
имеет неверное имя.Он должен называться invoice_files
, поскольку это коллекция.В вашем методе Invoice.save
вы пытаетесь перебрать связанную коллекцию, прежде чем добавите UploadFile
s в эту коллекцию.Я бы предложил добавить метод к вашей Invoice
модели.
class Invoice(models.Model):
...
def add_invoice_file(self, uploaded_file):
self.invoice_files.add(uploaded_file) # error if the Invoice hasn't been saved yet
for invoice_file in self.invoice_files.all():
status = invoice_file.locked_status(1)
if status != 1:
raise Exception('Blah')
Если Счет-фактура связан с большим количеством файлов, вместо использования .all()
, вам следует сделать self.invoice_files.filter(locked=False)
.В любом случае, это может даже стоить того, чтобы избежать большого количества ненужных сохранений базы данных.