Django:queryset“丢失”一个值

时间:2019-02-08 15:14:23

标签: python django django-queryset

我有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”查询集仍包含该值。

谢谢!

1 个答案:

答案 0 :(得分:1)

我假设ranking_clientesclient_rank相同。

问题是.get将始终对数据库执行新查询。这意味着您对原始查询中返回的字典所做的任何修改都不会应用于get调用的结果。

您需要遍历查询以找到所需的内容:

selected_subject = next(client for client in ranking_clientes if subject_code in client.cliente)

注意,如果您有很多客户,这效率很低。我会重新考虑您的模型结构。另外,您可以考虑使用database function作为原始查询的一部分直接返回排名。