Django - 循环访问相同数据的两个查询,并为每个查询添加成本字段

时间:2016-08-19 16:41:21

标签: python django

可能标题可能措辞得更好,但我正在与之斗争。

基本上我试图从我的模型中计算出每个站点的电路成本。电路模型根据以下内容模拟现场模型:

模型:

class ShowroomConfigData(models.Model):
    location = models.CharField(max_length=50)

class CircuitInfoData(models.Model):    
    showroom_config_data = models.ForeignKey(ShowroomConfigData,verbose_name="Install Showroom")
    major_site_info = models.ForeignKey(MajorSiteInfoData,verbose_name="Install Site") 
    circuit_type = models.CharField(max_length=100,choices=settings.CIRCUIT_CHOICES)    
    circuit_speed = models.IntegerField(blank=True)
    cost_per_month = models.DecimalField(decimal_places=2,max_digits=8)

这可能是如何通过查询完成的,但我已经尝试了一个以前的问题,它似乎我遇到了一个错误,所以我试图手动完成它

示例数据:

site a | 1
site a | 2
site a | 5
site b | 100
site b | 2
site d | 666
site d | 1    

所以我想制作

网站a | 8 网站b | 102 网站d | 667

我尝试这种方式作为测试:

circuits = CircuitInfoData.objects.all()  
showrooms = ShowroomConfigData.objects.only('location')

for sdata in showrooms:
    for cdata in circuits:
        while cdata.showroom_config_data.location == sdata.location:
         print sdata.location
         print cdata.cost

这已经在网站上产生了8次和8次。所以我不知道我应该怎么做呢?

由于

2 个答案:

答案 0 :(得分:1)

执行此操作的最有效方法是使用查询。这可以使用annotations以下列方式完成:

from django.db.models import Sum
CircuitInfoData.objects.values("showroom_config_data__location") \
                       .annotate(cost=Sum("cost_per_month"))

E.g。这将以

的形式返回数据
[{'showroom_config_data__location': u'site a', 'cost': Decimal('30.00')},
 {'showroom_config_data__location': u'site b', 'cost': Decimal('5.00')}]

然后您可以格式化此输出

for entry in output:
    print entry["showroom_config_data__location"], " | ", entry["cost"]

获得

site a | 30.00
site b | 5.00

答案 1 :(得分:0)

如果你刚使用字典怎么办?每个电路都可以进入陈列室吗?因此,如果您构建了一个字典并且只是在某个特定网站上提取了该值(如果已经将其用作密钥),则只需添加该值并再次存储即可。这是一个这样做的例子。

my_dictionary = dict()
for circuit in circuits:
     if my_dictionary[circuit.showroom_config_data.location] in my_dictionary:
          my_dictionary[circuit.showroom_config_data.location] += circuit.cost_per_month
     else:
          my_dictionary[circuit.showroom_config_data.location] = circuit.cost_per_month

可能无法正常工作,但代码背后的概念将为您提供所需的输出。