2012-05-30 3 views
5
class Beverage(models.Model): 
    name=models.CharField(max_length=255) 

    def __unicode__(self): 
     return self.name 

class Location(models.Model): 
    name=models.CharField(max_length=255) 
    beverages = models.ManyToManyField(Beverage, through='LocationStandard') 
    location_number=models.CharField(max_length=255) 
    organization=models.CharField(max_length=255) 

    def __unicode__(self): 
     return self.name 

class LocationStandard(models.Model): 
    beverage=models.ForeignKey(Beverage) 
    location=models.ForeignKey(Location) #elim this or m2m 
    start_units=models.IntegerField() 
    fill_to_standard=models.IntegerField(max_length=10) 
    order_when_below=models.IntegerField(max_length=10) 

class Order(models.Model): 
    location=models.ForeignKey(Location) #elim this or m2m 
    beverage=models.ForeignKey(Beverage) 
    units_ordered=models.IntegerField(max_length=10, default=0) 
    order_delivered=models.BooleanField(default=False) 
    timestamp=models.DateTimeField(auto_now_add=True) 
    user=models.ForeignKey(User) 

x軸上のすべての位置とy軸上のすべての飲み物でHTMLテーブルを取得するレポートを生成するにはどうすればよいですか。私が苦労している主なことは、ループすることができるテンプレートを渡すことができるかどうかを調べることだけです。思考?Djangoはレポートを作成します

+0

私は、Yの日付とXのカテゴリを必要としていた似たような、少しシンプルなシナリオを実行しました。かなり残忍なデータがありました。 +1、良い解決策があるかどうかを調べることに興味があります。 – Endophage

+0

BTW @ジャソンゴザレス、あなたはコロンビア大学で働いていますか? –

+0

コロンビアではない、面白い、なぜあなたは尋ねますか? – jasongonzales

答えて

2

あなたは1つのクエリでそれらを得ることはできませんが、(セットアップにテストするために、全体のenvをしたいので、手がかりはなく、実用的なソリューションとしてそれを使用しないでください)そのような何かを行うことができます。

# you can't do order_by in a template, either do them in the view, or 
# make methods in the model, or make it the Meta default ordering 

# print the header, and make sure we got a list of all beverage cached 
beverages = Beverage.objects.order_by('name') 
for beverage in beverages: 
    print each cell of your header 

# print a row for each location 
locations = Location.objects.all() 
for location in locations: 
    print the location name table cell 
    location_beverages = iter(location.beverages.order_by('name')) 
    # for each beverage, we print a cell. If the beverage is in the 
    # location beverage list, we print a checked cell 
    # we use the fact that queryset are iterable to move the cursor 
    # only when there is a match 
    cur_bev = location_beverages.next() 
    for beverage in beverages: 
     if beverage == cur_bev: 
      print checked table cell 
      cur_bev = location_beverages.next() 
     else: 
      print empty table cell 

クエリーセットを格納する中間変数は、Djangoクエリーセットのメリットを得ることができるため、非常に重要です。

Djangoの1.4以上を使用すると、置き換えることができます。

locations = Location.objects.all() 

で:

locations = Location.objects.prefetch_related('beverages') 

が深刻PERFブーストを取得するには。

+0

私はDjangoテンプレートに書いているので、実際に印刷するのではなく、値をdictに置き換えるべきでしょうか? – jasongonzales

+0

'.order_by( 'name')'を除いて、テンプレート内でこれをすべて行うことができます。かっこを緩め、{{value}}を使ってHTMLコードの中に値を表示してください。 –

関連する問題