2017-01-09 1 views
0

У меня есть модель Payment и модель Invoice. У счета-фактуры модели есть атрибут payment, который является полем OneToOneField с null=True и blank=True.Django не может создать объект - RelatedObjectDoesNotExist

Проблема в том, что Django не позволяет мне создавать платеж.

>>> Payment.objects.create(total_price=10) 

RelatedObjectDoesNotExist: Payment has no invoice. 

>>> Payment.objects.create(total_price=10,invoice=Invoice.objects.first()) 

TypeError: 'invoice' is an invalid keyword argument for this function 

Не могу понять, почему это так. Я хочу, чтобы Invoice имел необязательный аргумент payment и наоборот, потому что Payment объект создан после получения платежа.

class Invoice(models.Model): 
    identificator = models.UUIDField(default=uuid.uuid4, editable=False) 
    order = models.OneToOneField('Job', related_name='invoice', on_delete=models.CASCADE) 
    price_per_word = models.DecimalField(null=True, blank=True, decimal_places=2, max_digits=12) 
    translator_revenue_in_percent = models.FloatField(null=True, blank=True) 
    discount_in_percent = models.FloatField(default=0) 
    final_price = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True) 
    estimated_price = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True) 
    paid = models.BooleanField(default=False) 
    payment = models.OneToOneField('Payment', related_name='invoice', null=True, blank=True) 
    __original_paid = None 

    def save(self, *args, **kwargs): 

     if not self.__original_paid and self.paid: 
      self.__original_paid = True 
      if self.order.translator: 
       EventHandler.order_has_been_paid(self.order) 

     super(Invoice, self).save(*args, **kwargs) 

class Payment(models.Model): 
    payment_identifier = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 
    total_price = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True) 

    def save(self,*args,**kwargs): 
     EventHandler.order_has_been_paid(self.invoice.order) 
     super(Payment,self).save(*args,**kwargs) 

Знаете ли вы, где проблема?

ответ

3

Вы переопределить метод save вашей Payment модели для доступа к self.invoice, который, по-видимому, не существует, потому что не сохраненная платеж все же, меньше говорить фактуру.