Django创建报告

jas*_*les 5 python django report

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)
Run Code Online (Sandbox Code Playgroud)

如何生成一个报告,该报告将为我提供一个HTML表格,其中包含x轴上的所有位置以及y轴上的所有饮料.我正在努力解决的主要问题是如何查询我可以传递我可以循环的模板.思考?

e-s*_*tis 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
Run Code Online (Sandbox Code Playgroud)

存储查询集的中间变量非常重要,因为它们允许您从 Django 查询集缓存中受益。

使用 Django 1.4 或更高版本,您可以替换:

locations = Location.objects.all()
Run Code Online (Sandbox Code Playgroud)

经过:

locations = Location.objects.prefetch_related('beverages')
Run Code Online (Sandbox Code Playgroud)

获得严重的性能提升。