Django:如何在pre_save信号中传递外键值?

时间:2019-02-23 07:37:00

标签: python django django-models

这是我的模特

class Ledger1(models.Model):
    creation_Date   = models.DateField(default=datetime.date.today,blank=True, null=True)
    name            = models.CharField(max_length=32)
    group1_Name     = models.ForeignKey(Group1,on_delete=models.CASCADE,null=True,related_name='ledgergroups')

class Journal(models.Model):
    date            = models.DateField(default=datetime.date.today)
    voucher_id      = models.PositiveIntegerField(blank=True,null=True)
    voucher_type    = models.CharField(max_length=100,blank=True)
    by              = models.ForeignKey(Ledger1,on_delete=models.CASCADE,related_name='Debitledgers')
    to              = models.ForeignKey(Ledger1,on_delete=models.CASCADE,related_name='Creditledgers')
    debit           = models.DecimalField(max_digits=10,decimal_places=2,null=True)
    credit          = models.DecimalField(max_digits=10,decimal_places=2,null=True)

这是我的信号:

@receiver(pre_save, sender=Journal)
def pl_journal(sender,instance,*args,**kwargs):
    if instance.Debit != None or instance.Credit != None or instance.By.group1_Name.group_Name == 'Indirect Expense':
        Journal.objects.update_or_create(date=instance.date, voucher_id=instance.id, voucher_type= "Journal",by=instance.by,to=Ledger1.objects.get(name='Profit & Loss A/c'),debit=instance.debit,credit=instance.credit)

我想传递一个pre_save信号,即无论何时创建Journal对象名称为Group1的{​​{1}}对象,另一个具有相同{{1 }},其Indirect Expense值为by,应自动创建...

这行代码给我一个错误:

to

错误:

'Profit & Loss A/c'

谁能告诉我如何在pre_save信号中获取外键对象?

谢谢

1 个答案:

答案 0 :(得分:1)

当您只希望返回一个结果时,将使用get()。 因此,您应该使用其他一些唯一的输入,这些输入将返回您期望的唯一的唯一结果。

或者,如果您实际上希望返回多个结果,请改用filter()方法。像

Ledger1.objects.filter(name='Profit & Loss A/c')

但是在您的情况下,似乎只预期有1个结果,所以我建议使用唯一的输入,否则一种解决方法是:-

Ledger1.objects.filter(name='Profit & Loss A/c').first()

如果您尝试实现的逻辑类型还可以的话,这将返回仅是第一个获取的结果的单个结果。