【问题标题】:Calculate sum of columns matching 2 criteria within a for loop计算 for 循环中匹配 2 个条件的列的总和
【发布时间】:2023-01-07 22:51:07
【问题描述】:

希望计算符合 2 个要求的模型对象的总和。

例如,这就是表格的样子

User Venue Points
User_1 Venue_A 50
User_1 Venue_B 25
User_2 Venue_A 1
User_1 Venue_A 50
User_2 Venue_A 1
User_1 Venue_C 25

在此示例中,我想使用 for loop 将针对 User_1 的每个场地分配的点数相加。

User Venue Total Points
User_1 Venue_A 100
User_1 Venue_B 25
User_1 Venue_C 25

我正在努力理解如何表达在循环中进行双重检查的需要

  1. 第 1 步:检查 1 - 查找 user.request
  2. 第 2 步:检查 2 - 查找 venue_x
  3. 第三步:加分;
  4. 第 4 步:...为下一个场地重新启动流程

    我当前的功能有两个问题:

    1. 它独立于场地计算所有点的总和
    2. 它在for loop 中使用的查询集之外,因此无法返回特定于venue 的数字总和(假设我能得到第一点工作)

      模型.py

      class Itemised_Loyatly_Card(models.Model):
          user = models.ForeignKey(UserProfile, blank=True, null=True, on_delete=models.CASCADE)
          venue = models.ForeignKey(Venue, blank=True, null=True, on_delete=models.CASCADE)
          add_points = models.IntegerField(name = 'add_points', null = True, blank=True, default=0)
      

      观点

      from django.db.models import Sum
      
      def user_loyalty_card(request):
          itemised_loyalty_cards = Itemised_Loyatly_Card.objects.filter(user=request.user.id)
          sum_objects = Itemised_Loyatly_Card.objects.filter(user=request.user.id).aggregate(Sum("add_points")) # considering the loop will be with itemised_loyalty_cards , should the sum be in the same queryset?
         
          return render(request,"main/account/user_loyalty_card.html", {'itemised_loyalty_cards':itemised_loyalty_cards,'sum_objects':sum_objects})
      

      模板

      {%for itemised_loyatly_card in itemised_loyalty_cards %}
      
      {{itemised_loyatly_card.venue}}
      {{itemised_loyatly_card.sum_objects}}</td> #**<-- this is obviously not working**
      
      {%endfor%}
      

【问题讨论】:

    标签: python django-models django-views django-templates


    【解决方案1】:

    好的,部分回答我自己的问题。

    我需要使用 .values() (这标识了条件所在的列,在我的例子中是场地) 和.annotate() (这标识了我需要总结的符合条件的列)

    观点(无法在堆栈上正确设置格式)

    def function(request):
    queryset = model.objects.filter(user=request.user.id).values('venue').annotate(add_points=Sum('add_points')).annotate(use_points=Sum('use_points')).annotate(total=F('add_points')-F('use_points'))
    return render(request,"main/account/user_loyalty_card.html", {'itemised_loyalty_cards':itemised_loyalty_cards})
    

    模板

    {%for modelname in queryset %}
    {{itemised_loyatly_card.venue}}
    {{itemised_loyatly_card.total}}
    {%endfor%}
    

    仅部分回答,因为它会产生问题 - foorlop 现在由于某种原因返回场地 ID 而不是名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多