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

¿Cómo puedo generar un informe que me dará una tabla HTML con todas las ubicaciones en el eje xy todas las bebidas en el eje y. Lo principal con lo que estoy luchando es qué preguntar que puedo pasar la plantilla sobre la que puedo pasar. ¿Pensamientos?Django crear informe

+0

Me encontré con un escenario similar pero un poco más simple en el que necesitaba fechas en la Y y en las categorías de la X. Lo resolví con algunos datos bastante brutales. +1, interesado en ver si hay una buena solución. – Endophage

+0

BTW @jasongonzales, ¿trabajas en la universidad de columbia? –

+0

no en columbia, gracioso, ¿por qué lo preguntas? – jasongonzales

Respuesta

2

No se puede obtener en una consulta, pero se puede hacer algo por el estilo (no quieren configurar un env todo para poner a prueba, a fin de utilizarlo como una pista, no una solución de trabajo):

# 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 

Las variables intermedias para almacenar los conjuntos de consulta son muy importantes, ya que le permiten beneficiarse de la memoria caché de Django queryset.

Con Django 1.4 o más, puede reemplazar:

locations = Location.objects.all() 

Por:

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

Para obtener un serio impulso perf.

+0

Entonces, para que quede claro, ya que estoy escribiendo en una plantilla de Django, probablemente debería sustituir los valores por un dict, en lugar de imprimirlos, ¿sí? – jasongonzales

+0

Excepto el '.order_by ('nombre')', puede hacer todo esto en la plantilla. Simplemente suelte el paréntesis y use {{value}} para imprimir un valor entre el código HTML. –

Cuestiones relacionadas