可能标题可能措辞得更好,但我正在与之斗争。
基本上我试图从我的模型中计算出每个站点的电路成本。电路模型根据以下内容模拟现场模型:
模型:
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次。所以我不知道我应该怎么做呢?
由于
答案 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
可能无法正常工作,但代码背后的概念将为您提供所需的输出。