如何用Python筛选未被Factura表外键关联的Cliente表数据
筛选未在Factura表中注册的Cliente客户数据
需求:找出所有尚未在Factura表中注册(无对应账单记录)的Cliente表客户数据,若需针对特定状态/时间的账单,也可按以下方式调整。
模型定义
models.py
class Cliente(models.Model): contador = models.AutoField(primary_key=True) class Factura(models.Model): factura_nr = models.CharField(primary_key=True, max_length=100) contador = models.ForeignKey(Cliente, on_delete=models.CASCADE) estado_factura = models.CharField(max_length=20, default='Aberta', blank=True) # 注:原视图代码中用到了data_leitura字段,当前模型未定义,需确认是否遗漏该字段
现有视图代码问题
原views.py代码存在两处问题:
facturas_abertas2通过values返回的是字典列表,直接用contador=facturas_abertas2无法完成匹配- 逻辑方向错误,原代码是筛选关联了指定账单的客户,和需求“未注册”完全相反
正确实现方式
场景1:筛选无任何账单记录的客户
这是最直接的需求实现:
# 查询所有没有关联Factura的客户 clientes_sem_factura = Cliente.objects.filter(factura__isnull=True) # 统计数量 total_clientes = clientes_sem_factura.count()
场景2:筛选无当月“已开(Aberta)”状态账单的客户
如果需求是排除有当月已开账单的客户,按以下方式编写:
from datetime import date # 先获取当月已开账单关联的客户ID列表 clientes_com_factura_aberta = Factura.objects.filter( data_leitura__month=date.today().month, estado_factura='Aberta' ).values_list('contador__contador', flat=True) # 返回纯ID的一维数组 # 筛选不在上述列表中的客户 clientes_sem_factura_aberta = Cliente.objects.exclude(contador__in=clientes_com_factura_aberta) total_clientes = clientes_sem_factura_aberta.count()
要点提示
filter(factura__isnull=True):利用Django反向关联特性,直接匹配无任何账单的客户,写法简洁高效values_list(..., flat=True):返回纯字段值的一维列表,比values更适合用于__in查询条件exclude方法:用于排除满足指定条件的记录,正好对应“未注册”的需求逻辑
内容的提问来源于stack exchange,提问作者Quetions
相关产品推荐
相关产品推荐

