【发布时间】:2019-07-02 20:51:48
【问题描述】:
我有 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”查询集中得到预期值:“client name”+“total sales per 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”查询集仍然包含该值。
谢谢!
【问题讨论】:
-
什么是
all_clients,它与client_rank有什么关系? -
嗨@DanielRoseman 您可以在我解释的开头看到这一点。 “所有客户”是带有客户列表的查询集,“client_rank”来自“销售”查询集。两者都有一个包含客户名称的字段。没有 ForeignFiled 直接关联它们,这就是为什么我应该比较这些值。
标签: python django django-queryset