我有2种型号,一种带有客户列表,另一种带有销售列表。 我的意图是将销售排名值添加到客户查询集中。
all_clients = Contactos.objects.values("id", "Vendedor", "codigo", 'Nombre', "NombrePcia", "Localidad", "FechaUltVenta")
sales = Ventas.objects.all()
加载后,我会汇总每个客户的所有销售额,汇总其销售额的小计值,然后按其总销售额对结果进行排序。
sales_client = sales.values('cliente').annotate(
fact_total=Sum('subtotal'))
client_rank = sales_client .order_by('-fact_total')
然后,我设置那些客户端的等级,并将该值存储在同一client_rank查询集中的“排名”值中。
a = 0
for rank in client_rank:
a = a + 1
rank['Rank'] = a
到目前为止一切都很好。当我在模板中打印结果时,我在“ client_rank”查询集中获得了预期值:“客户名称” +“每个客户的总销售额” +“排名”。
{'cliente': '684 DROGUERIA SUR', 'fact_total': Decimal('846470'), 'Rank': 1}
{'cliente': '699 KINE ESTETIC', 'fact_total': Decimal('418160'), 'Rank': 2}
etc....
问题从这里开始
首先,我们应该考虑到并非“ all_clients”查询集中的所有客户在“ sales”查询集中都具有实际销售额。因此,我必须找到哪些有销售量,为他们分配“等级”值,为没有销售量的人分配标准值。
for subject in all_clients:
subject_code = str(client["codigo"])
try:
selected_subject = ranking_clientes.get(cliente__icontains=subject_code)
subject ['rank'] = selected_subject['Rank']
except:
subject ['rank'] = "Some value"
尝试总是失败,因为“ selected_subject”似乎没有“ Rank”值。如果打印“ selected_subject”,则会得到以下信息:
{'cliente': '904 BAHIA BLANCA BASKET', 'fact_total': Decimal('33890')}
关于我为什么失去“等级”价值的任何线索?原始的“ client_rank”查询集仍包含该值。
谢谢!
答案 0 :(得分:1)
我假设ranking_clientes
与client_rank
相同。
问题是.get
将始终对数据库执行新查询。这意味着您对原始查询中返回的字典所做的任何修改都不会应用于get
调用的结果。
您需要遍历查询以找到所需的内容:
selected_subject = next(client for client in ranking_clientes if subject_code in client.cliente)
注意,如果您有很多客户,这效率很低。我会重新考虑您的模型结构。另外,您可以考虑使用database function作为原始查询的一部分直接返回排名。