我有以下型号:
class Group(models.Model):
group_name = models.CharField(max_length=32)
class Ledger(models.Model):
ledger_name = models.CharField(max_length=32)
group_name = models.ForeignKey(Group,on_delete=models.CASCADE,null=True,related_name='ledgergroups')
class Journal(models.Model):
By = models.ForeignKey(Ledger,on_delete=models.CASCADE,related_name='Debitledgers')
To = models.ForeignKey(Ledger,on_delete=models.CASCADE,related_name='Creditledgers')
Debit = models.DecimalField(max_digits=20,decimal_places=2,default=0)
Credit = models.DecimalField(max_digits=20,decimal_places=2,default=0)
如您所见,Journal
模型与具有Ledger
关系的Foreignkey
模型相关,并且进一步与Group
模型相关。
我的情况有点复杂。
我想过滤Group
对象及其余额(余额是它们的总计Debit
与它们的总计Credit
之差)。
我要过滤组名的总数,并过滤总Debit
和总Credit
的减法。( Debit
和Credit
是{的字段{1}}模型)。
任何人都可以帮助我解决以上问题。
我之前在Journal
中尝试过Subqueries
,但是在Django
中没有做两步Subquery
。
任何解决方案都会有所帮助。
谢谢
答案 0 :(得分:0)
您可以使用注释来计算总和,平均值,计数等。然后可以使用这些注释进行过滤
from django.db.models import Sum, F
groups_with_negative_balance = Group.objects.annotate(
total_debt=Sum('ledgergroups__Debitledgers__Debit'),
total_credit=Sum('ledgergroups__Creditledgers__Credit'),
).annotate(
balance=F('total_credit') - F('total_debt')
).filter(
balance__lt=0
)
答案 1 :(得分:0)
尝试
from django.db.models import Subquery
>>> users = User.objects.all()
>>> UserParent.objects.filter(user_id__in=Subquery(users.values('id')))
<QuerySet [<UserParent: UserParent object (2)>, <UserParent: UserParent object (5)>, <UserParent: UserParent object (8)>]>