2017-01-09 107 views
0

我有一个模型Payment和模型Invoice。模型发票具有属性payment,该属性是OneToOneField字段,其​​中null=Trueblank=TrueDjango无法创建对象 - 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

你重写您Payment模型save方法访问self.invoice这显然不存在,因为没有保存的尚未支付,少说话的发票。