2016-08-19 5 views
0

タイトルはよりよく表現されていますが、それに苦しんでいる可能性があります。Django - 同じデータに対して2つのクエリをループし、それぞれのコストフィールドを追加します。

基本的には、私のモデルからサイトあたりの回路コストを集計しようとしています。回路モデルは以下のとおりサイトモデルをinherts:

モデル:これはおそらく、クエリで行うことができるが、透過性の問題にしようと、IVEがしようとイムので、バグを打つようだアイブ方法

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 |これはちょうど、サイトAと時間の8 x量を解約した

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 

667 iは、テストとしてこの方法を試してみました。だから私はどうやってこのことをどうやってやるべきか分からない。

おかげ

答えて

1

これを行うための最も効率的な方法は、クエリを使用しています。これは、次のように、annotationsを使用して達成することができます。

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

これは、フォーム内のデータ

[{'showroom_config_data__location': u'site a', 'cost': Decimal('30.00')}, 
{'showroom_config_data__location': u'site b', 'cost': Decimal('5.00')}] 

を返します。これで、あなただけの辞書を使用した場合にどのような

site a | 30.00 
site b | 5.00 
+0

これはサイトaを返します。 1、サイトa | 12、サイトa | 3などのように、場所が同じではない場所を集計しています... – AlexW

+0

固定、私はこの問題をあらゆる種類の問題の原因となっていました=( 'showroom_config_data__location'、 'circuit_speed') – AlexW

0

を取得するには、この出力

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

をフォーマットすることができますか?各回路はショールームの権利にアクセスできますか?したがって、辞書を作成して、特定のサイトの値を既にキーとして使用している場合は、単純にその値を追加して保存し直すことができます。ここにこれが行われた例があります。

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 

正確には動作しませんが、コードの背後にあるコンセプトは、あなたが探している出力を得られます。

関連する問題