Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我可以在django pre_save signals中执行查询吗?_Python_Django_Django Models_Django Signals - Fatal编程技术网

Python 我可以在django pre_save signals中执行查询吗?

Python 我可以在django pre_save signals中执行查询吗?,python,django,django-models,django-signals,Python,Django,Django Models,Django Signals,这是models.py class ledger1(models.Model): User = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,null=True,blank=True) Company = models.ForeignKey(company,on_delete=models.CASCADE,null=True,blank=True,related_name='Companys

这是models.py

class ledger1(models.Model):
    User = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,null=True,blank=True)
    Company = models.ForeignKey(company,on_delete=models.CASCADE,null=True,blank=True,related_name='Companys')
    Creation_Date = models.DateField(default=datetime.now)
    name = models.CharField(max_length=32,unique=True)
    Opening_Balance = models.DecimalField(max_digits=19,decimal_places=2)
    Closing_balance = models.DecimalField(max_digits=10,decimal_places=2)


class journal(models.Model):
    User = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,null=True,blank=True)
    Company = models.ForeignKey(company,on_delete=models.CASCADE,null=True,blank=True,related_name='Companyname')
    Date = models.DateField()
    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,)
    Credit = models.DecimalField(max_digits=10,decimal_places=2)
我想使用django查询建立一个数学方程式,方程式的结果将显示在ledger1.Closing_Balance字段中

所以我试过这个:

@receiver(pre_save, sender=ledger1)
def update_user_closing_balance(sender,instance,*args,**kwargs):
    Closing_balance = ledger1.objects.annotate(debitsum=Sum('Debitledgers__Debit')) + instance.Opening_Balance - ledger1.objects.annotate(creditsum=Sum('Creditledgers__Credit'))
    instance.Closing_balance = Closing_balance
在django有可能吗??? 因为如果我运行这个,我会得到不支持的操作数错误

有其他的代码吗

如果有人知道,请帮忙


提前感谢

不支持的操作数异常与查询本身无关,但与您编写的表达式有关:

Closing_balance = (
   ledger1.objects.annotate(debitsum=Sum('Debitledgers__Debit')) +
   instance.Opening_Balance -
   ledger1.objects.annotate(creditsum=Sum('Creditledgers__Credit'))
)
因此,在这里您将
QuerySet
s与实际值一起添加,这没有任何意义。您可能想要使用的是一个
.aggregate(..)
,然后将它包含的值从中包装出来,如:

debitsum = ledger1.objects.aggregate(debitsum=Sum('Debitledgers__Debit'))['debitsum']
creditsum = ledger1.objects.aggregate(creditsum=Sum('Creditledgers__Credit'))['creditsum']

Closing_balance = debitsum + instance.Opening_Balance - creditsum
但尽管如此,使用信号来预先计算总量通常不是一个好主意。例如,由于
日记账
对象可以更改其
借方
贷方
值,并且这不会“触发”信号,因此不会进行更新。即使您还为此类事件添加了逻辑,也可能发生信号不触发的情况,因为例如批量更新将超过信号系统

通常,最好不要存储数据聚合,因为这会导致“冗余和不一致”,正如文章所说。如果要计算此类聚合,最好在数据库级别使用(物化)视图

编辑:但是查询本身似乎没有任何意义。如果您更新了
分类账
记录,则可以执行筛选,并通过以下方式计算更新:

@receiver(pre_save, sender=ledger1)
def update_user_closing_balance(sender,instance,*args,**kwargs):
    debit = instance.Debitledgers.aggregate(debit=Sum('Debit'))['debit']
    credit = instance.Creditledgers.aggregate(credit=Sum('Credit'))['credit']
    instance.Closing_balance = instance.Opening_Balance + debit - credit

但这可能仍然不够,因为您需要对日期等进行适当筛选。

不支持的操作数异常与查询本身无关,但与您编写的表达式有关:

Closing_balance = (
   ledger1.objects.annotate(debitsum=Sum('Debitledgers__Debit')) +
   instance.Opening_Balance -
   ledger1.objects.annotate(creditsum=Sum('Creditledgers__Credit'))
)
因此,在这里您将
QuerySet
s与实际值一起添加,这没有任何意义。您可能想要使用的是一个
.aggregate(..)
,然后将它包含的值从中包装出来,如:

debitsum = ledger1.objects.aggregate(debitsum=Sum('Debitledgers__Debit'))['debitsum']
creditsum = ledger1.objects.aggregate(creditsum=Sum('Creditledgers__Credit'))['creditsum']

Closing_balance = debitsum + instance.Opening_Balance - creditsum
但尽管如此,使用信号来预先计算总量通常不是一个好主意。例如,由于
日记账
对象可以更改其
借方
贷方
值,并且这不会“触发”信号,因此不会进行更新。即使您还为此类事件添加了逻辑,也可能发生信号不触发的情况,因为例如批量更新将超过信号系统

通常,最好不要存储数据聚合,因为这会导致“冗余和不一致”,正如文章所说。如果要计算此类聚合,最好在数据库级别使用(物化)视图

编辑:但是查询本身似乎没有任何意义。如果您更新了
分类账
记录,则可以执行筛选,并通过以下方式计算更新:

@receiver(pre_save, sender=ledger1)
def update_user_closing_balance(sender,instance,*args,**kwargs):
    debit = instance.Debitledgers.aggregate(debit=Sum('Debit'))['debit']
    credit = instance.Creditledgers.aggregate(credit=Sum('Credit'))['credit']
    instance.Closing_balance = instance.Opening_Balance + debit - credit

但这可能仍然不够,因为您需要对日期等进行适当的筛选。

不,实际上,我希望不同分类账的期末余额不同……如果我使用合计,则所有分类账的期末余额相同……是否有可能执行此操作?@NiladryKar:假设不同的分类账<代码>分类账s,那么您应该如何将其保存为
实例
?一个
pre\u save
,和
post\u save
总是在一个实例上工作。哦,是的,完全忘记了……你能给我提供另一种执行方法吗?@Willem VanOnsem@NiladryKar当前位置不知何故,你总是以XY问题结束,而不是解释你想如何解决某个问题,试着解释你想要解决的问题。非常感谢much@WillemVan Onsem…是的,我知道这只是完成了一半…非常感谢你提供给我这正是我想要的…不,实际上我想要不同分类账的不同期末余额…如果我使用合计,所有分类账的期末余额都一样…有吗执行此操作的可能性?@NiladryKar:假设这是不同的
分类账
s,那么您应该如何将其保存为
实例
?一个
pre\u save
,和
post\u save
总是在一个实例上工作。哦,是的,完全忘记了……你能给我提供另一种执行方法吗?@Willem VanOnsem@NiladryKar当前位置不知何故,你总是以XY问题结束,而不是解释你想如何解决某个问题,试着解释你想要解决的问题。非常感谢much@Willem范昂森…是的,我知道这只是完成了一半…非常感谢你提供给我这正是我想要的。。。