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

Come posso generare un report che mi fornirà una tabella HTML con tutte le posizioni sull'asse xe tutte le bevande sull'asse y. La cosa principale con cui sto lottando è proprio quello di interrogare che posso passare il modello su cui posso eseguire il loop. Pensieri?Django crea report

+0

Mi sono imbattuto in uno scenario simile, ma leggermente più semplice, in cui avevo bisogno di date sulla Y e categorie sulla X. Risolto con alcuni dati muggenti piuttosto brutali. +1, interessato a vedere se c'è una buona soluzione. – Endophage

+0

BTW @jasongonzales, lavori all'università di Columbia? –

+0

non in Colombia, divertente, perché me lo chiedi? – jasongonzales

risposta

2

Non potete farli in una query, ma si può fare una cosa del genere (non si vuole impostare un intero env per testare, in modo da utilizzarlo come un indizio, non una soluzione di lavoro):

# 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 

Le variabili intermedie per memorizzare i set di query sono molto importanti, in quanto consentono di beneficiare della cache del queryset Django.

Con Django 1.4 o superiore, è possibile sostituire:

locations = Location.objects.all() 

By:

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

Per ottenere un serio impulso perf.

+0

Quindi, tanto per essere chiari, visto che sto scrivendo su un modello Django, probabilmente dovrei sostituire i valori con un dettato, piuttosto che stamparli, sì? – jasongonzales

+0

Eccetto '.order_by ('nome')', puoi fare tutto questo nel modello. Basta perdere la parentesi e usare {{value}} per stampare un valore tra il codice HTML. –

Problemi correlati