Django Annotation,Django做双左外连接

时间:2016-10-02 07:27:55

标签: django postgresql django-queryset

我有点问题。

我有一个名为Customer的模型 我还有另外两个名为发票和付款的模型 现在,Invoice对客户是FK,付款是FK到发票

我想要一个查询,在那里我可以找出客户的余额。

我的发票模型包含以下字段:

invoice_id = models.CharField(blank=True, max_length=12)
total=models.DecimalField(max_digits=12, decimal_places=2)
grand_discount=models.DecimalField(max_digits=10, decimal_places=2)
customer=models.ForeignKey(Customer, related_name='salesInvoice_sales_master_customer')

我的付款方式如下:

invoice_no=models.ForeignKey(salesInvoice, related_name='salesPayment_sales_sales_salesInvoice')
amount_paid=models.DecimalField(max_digits=12, decimal_places=2)
collected_on=models.DateTimeField(null=True)

现在,我按如下方式调用Customer对象上的annotate:

customers = Customer.objects.for_tenant(request.user.tenant).annotate(total=
    Sum('salesInvoice_sales_master_customer__total')\
    -Sum('salesInvoice_sales_master_customer__grand_discount')\
    -Sum('salesInvoice_sales_master_customer__salesPayment_sales_sales_salesInvoice__amount_paid'))

所有工作都在工作文件,直到最后一行(我通过删除销售付款的最后一个SUM来检查。即付款模式)。在进行此查询时,Django会对发票模型执行“双重”LEFT OUTER JOIN,因此总计和grand_discount会加倍。例如,总数为1000,grand_discount为100,amount_paid为500,查询显示总数为2000,grand_discount为200,amount_paid为500

除了RAW SQL(我的DB是postgresql)之外,还有什么方法可以解决这个问题吗?

0 个答案:

没有答案