2012-05-30 2 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) 

Как создать отчет, который даст мне таблицу HTML со всеми местоположениями по оси x и всем напиткам по оси y. Главное, с чем я борюсь, - это то, что я могу запросить, чтобы передать шаблон, который я могу перебрать. Мысли?Django создать отчет

+0

Я столкнулся с похожим, но немного более простым сценарием, где мне нужны даты на Y и категории на X. Решили его с помощью довольно грубых данных. +1, заинтересованы в том, есть ли хорошее решение. – Endophage

+0

BTW @jasongonzales, вы работаете в университете Колумбии? –

+0

не в колумбии, смешно, почему вы спрашиваете? – jasongonzales

ответ

2

Вы не можете получить их в одном запросе, но вы можете сделать что-то подобное (не требуется для установки в целом окр для тестирования, поэтому использовать его в качестве ключа, а не рабочий раствор):

# 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() 

By:

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

Чтобы получить серьезный импульс перфорация.

+0

Итак, чтобы быть понятным, так как я пишу шаблон Django, я должен, вероятно, заменить нажатие значений на dict, а не на самом деле их печать, да? – jasongonzales

+0

За исключением '.order_by ('name')', вы можете сделать все это в шаблоне. Просто потеряйте скобки и используйте {{значение}} для печати значения среди HTML-кода. –