2012-05-30 5 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와 Y에 대한 날짜가 필요했던 곳과 비슷하지만 약간 간단한 시나리오로 실행되었습니다. 일부 잔인한 데이터로 해결되었습니다. +1, 좋은 해결책이 있는지 알고 싶습니다. – Endophage

+0

BTW @ jasongonzales, 콜롬비아 대학에서 일하고 있니? –

+0

콜럼비아에 없으면 재미 있네. 왜 묻는거야? – jasongonzales

답변

2

당신은 하나 개의 쿼리에 그들을 얻을 수는 없지만 그런 걸 할 수 있습니다 (설정을 테스트 할 수있는 전체 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 

쿼리 세트를 저장하는 매개 변수는 장고 쿼리 세트 캐시의 이점을 활용할 수 있으므로 매우 중요합니다.

장고 1.4 이상, 당신은 대체 할 수

locations = Location.objects.all() 

작성자 :

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

심각한 반환 한 향상을 얻을 수 있습니다.

+0

Django 템플릿을 작성하고 있기 때문에 실제로 값을 인쇄하는 것이 아니라 실제로 인쇄하는 것이 좋습니다. – jasongonzales

+0

'.order_by ('name')'을 제외하고,이 모든 것을 템플릿에서 할 수 있습니다. 괄호를 풀고 {{value}}를 사용하여 HTML 코드 사이에 값을 인쇄하십시오. –

관련 문제