Nil*_*Kar 7 django django-queryset django-views
我的模特:
class GroupBase(models.Model):
"""
Predefined base group name
"""
YesNo = (
('Yes', 'Yes'),
('No', 'No')
)
name = models.CharField(max_length=32, unique=True)
parent = models.CharField(max_length=20)
is_revenue = models.CharField(max_length=3, choices=YesNo, default='No')
affects_trading = models.CharField(max_length=3, choices=YesNo, default='No')
is_debit = models.CharField(max_length=3, choices=YesNo, default='No')
def __str__(self):
return self.name
class LedgerGroup(models.Model):
"""
Ledger Group Master
"""
group_name = models.CharField(max_length=50)
group_base = models.ForeignKey(GroupBase, on_delete=models.DO_NOTHING, related_name='base_group', default=1)
def __str__(self):
return self.group_name
class LedgerMaster(models.Model):
"""
Ledger Master
"""
ledger_name = models.CharField(max_length=80) # unique together with company using meta
ledger_group = models.ForeignKey(LedgerGroup, on_delete=models.DO_NOTHING, related_name='group_ledger')
closing_balance = models.DecimalField(default=0.00, max_digits=20, decimal_places=2)
def __str__(self):
return self.ledger_name
Run Code Online (Sandbox Code Playgroud)
我有以下查询:
group_debit_positive = GroupBase.objects.filter(base_group__group_ledger__company=company,is_debit__exact='Yes',base_group__group_ledger__closing_balance__gt=0).annotate(
total_debit_positive=Coalesce(Sum('base_group__group_ledger__closing_balance'), Value(0)),
total_debit_negative=Sum(0,output_field=FloatField()),
total_credit_positive=Sum(0,output_field=FloatField()),
total_credit_negative=Sum(0,output_field=FloatField()))
group_debit_negative = GroupBase.objects.filter(base_group__group_ledger__company=company,is_debit__exact='Yes',base_group__group_ledger__closing_balance__lt=0).annotate(
total_debit_positive=Sum(0,output_field=FloatField()),
total_debit_negative=Coalesce(Sum('base_group__group_ledger__closing_balance'), Value(0)),
total_credit_positive=Sum(0,output_field=FloatField()),
total_credit_negative=Sum(0,output_field=FloatField()))
group_credit_positive = GroupBase.objects.filter(base_group__group_ledger__company=company,is_debit__exact='No',base_group__group_ledger__closing_balance__gt=0).annotate(
total_debit_positive=Sum(0,output_field=FloatField()),
total_debit_negative=Sum(0,output_field=FloatField()),
total_credit_positive=Coalesce(Sum('base_group__group_ledger__closing_balance'), Value(0)),
total_credit_negative=Sum(0,output_field=FloatField()))
group_credit_negative = GroupBase.objects.filter(base_group__group_ledger__company=company,is_debit__exact='No',base_group__group_ledger__closing_balance__lt=0).annotate(
total_debit_positive=Sum(0,output_field=FloatField()),
total_debit_negative=Sum(0,output_field=FloatField()),
total_credit_positive=Sum(0,output_field=FloatField()),
total_credit_negative=Coalesce(Sum('base_group__group_ledger__closing_balance'), Value(0)))
Run Code Online (Sandbox Code Playgroud)
我执行了所有查询的并集:
final_set = group_debit_positive.union(group_debit_negative,group_credit_positive,group_credit_negative)
Run Code Online (Sandbox Code Playgroud)
我想得到一个单一的结果,而不是在我的联合查询集中重复。
例如:
每当我尝试打印结果查询集
for g in final_set:
print(g.name,'-',g.total_credit_positive,'-',g.total_credit_negative)
Run Code Online (Sandbox Code Playgroud)
我得到这样的结果:
Sundry Creditors - 0.0 - -213075
Purchase Accounts - 0.0 - 0.0
Sundry Creditors - 95751.72 - 0.
Sales Accounts - 844100.0 - 0.0
Sales Accounts - 0.0 - -14000.0
Run Code Online (Sandbox Code Playgroud)
如您所见Sales Account,重复了两次。
我想要以下内容:
Sundry Creditors - 0.0 - -213075
Purchase Accounts - 0.0 - 0.0
Sundry Creditors - 95751.72 - 0.
Sales Accounts - 844100.0 - -14000.0
Run Code Online (Sandbox Code Playgroud)
如何停止结果的重复并使之成为单个结果。
有人知道如何执行此操作吗?
编辑
我进一步尝试使用“ |” 要合并查询集,它会成功合并而不会重复,但是会添加具有相同名称的结果。
我已经完成以下工作:
final_queryset = group_debit_positive | group_debit_negative | group_credit_positive | group_credit_negative
Run Code Online (Sandbox Code Playgroud)
结果如下所示:
Sundry Creditors - -213075 - 0.0
Purchase Accounts - 0.0 - 0.0
Sundry Creditors - 95751.72 - 0.
Sales Accounts - 830100 - 0.0
Run Code Online (Sandbox Code Playgroud)
它的添加结果就像结果Sales Accounts变得一样830100(844100.0 + (-14000.0)。
谁能帮助我找出我做错了什么。
谢谢
您可以将filterfor 参数Sum与每个注释的不同Q对象一起使用。还可以使用values查询集的方法按字段对输出进行分组name,这样输出中就不会出现同名的单独条目:
final_set = GroupBase.objects.filter(
base_group__group_ledger__company=company).values('name').annotate(
total_debit_positive=Sum('base_group__group_ledger__closing_balance', output_field=FloatField(),
filter=Q(is_debit__exact='Yes', base_group__group_ledger__closing_balance__gt=0)),
total_debit_negative=Sum('base_group__group_ledger__closing_balance', output_field=FloatField(),
filter=Q(is_debit__exact='Yes', base_group__group_ledger__closing_balance__lt=0)),
total_credit_positive=Sum('base_group__group_ledger__closing_balance', output_field=FloatField(),
filter=Q(is_debit__exact='No', base_group__group_ledger__closing_balance__gt=0)),
total_credit_negative=Sum('base_group__group_ledger__closing_balance', output_field=FloatField(),
filter=Q(is_debit__exact='No', base_group__group_ledger__closing_balance__lt=0))
)
for g in final_set:
print(
g['name'], g['total_debit_positive'], g['total_debiit_negative'],
g['total_credit_positive'], g['total_credit_negative'], sep=' - '
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
175 次 |
| 最近记录: |