基于Django多表关联,从Customer表构建聚合查询的技术问询
客户数据查询需求与技术困境
参考模型定义
from django.db import models from django.db.models import Model, CASCADE, DecimalField, CharField, OneToOneField, ForeignKey, DateField # 假设PAYMENT_DUE_DATES为预定义选项元组,示例: # PAYMENT_DUE_DATES = ( # ('7D', '7 Days'), # ('14D', '14 Days'), # ('30D', '30 Days'), # ) class CustomerInformation(Model): first_name = models.CharField(max_length=255) last_name = models.CharField(max_length=255) class CustomerCreditInformation(Model): customer = OneToOneField(CustomerInformation, on_delete=CASCADE) max_credit_amount = DecimalField( max_digits=10, decimal_places=2, verbose_name='Credit Amount') due_in = CharField(choices=PAYMENT_DUE_DATES, max_length=4, verbose_name='Payable before') class Invoice(Model): financial_party = models.ForeignKey( CustomerInformation, on_delete=models.CASCADE, null=True, verbose_name="Submit Invoice To:") date_billed_original = models.DateField( verbose_name='Billed Date', editable=False, null=True) class InvoicePayment(models.Model): invoice = models.ForeignKey(Invoice, on_delete=models.CASCADE) amount = models.DecimalField( max_digits=12, decimal_places=2, verbose_name='Payment Amount') class Charges(models.Model): invoice = models.ForeignKey(Invoice, on_delete=models.CASCADE) amount = models.DecimalField(max_digits=12, decimal_places=2)
注:发票可创建但未出账,即未出账的发票也可能存在费用记录。
需求说明
需从CustomerInformation表发起单次查询,返回包含以下字段的字典:客户姓名、信用额度、已出账未结清总额、逾期未结清总额,具体需求点:
- 拼接客户姓名(已完成)
- 标注客户最高信用额度(已完成)
- 标注所有已出账发票的未结清费用(过滤条件待明确)
- 标注逾期未结清费用:筛选出账日期早于「当前本地日期 - customercredit__due_in对应的时间差」的发票
现状与问题
- 目前已从
Invoice表实现上述查询,但业务要求必须从Customer表发起(需结合客户列表页的其他功能) Invoice模型已编写Manager函数:AnnotatePayments:计算单张发票的费用总和与付款总和,标注未结余额BilledNotPaid:调用AnnotatePayments,排除未出账的发票
- 无法通过子查询等方式复用现有Manager函数,且不愿重复编写逻辑
内容的提问来源于stack exchange,提问作者jjulian91
相关产品推荐
相关产品推荐

