【问题标题】:Django: queryset "loosing" a valueDjango:查询集“丢失”一个值
【发布时间】: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


【解决方案1】:

我认为ranking_clientesclient_rank 相同。

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

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

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

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

【讨论】:

  • 谢谢@DanielRoseman。这就解释了。我将研究数据库功能选项,因为我无法更改原始模型的结构。
猜你喜欢
  • 1970-01-01
  • 2016-05-09
  • 1970-01-01
  • 2019-07-01
  • 2017-07-09
  • 1970-01-01
  • 2013-04-08
  • 1970-01-01
  • 2013-02-28
相关资源
最近更新 更多