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) 

मैं एक रिपोर्ट कैसे उत्पन्न कर सकता हूं जो मुझे एक्स-अक्ष पर सभी स्थानों और वाई-अक्ष पर सभी पेय पदार्थों के साथ एक HTML तालिका प्राप्त करेगी। जिस चीज के साथ मैं संघर्ष कर रहा हूं वह सिर्फ यह पूछना है कि मैं उस टेम्पलेट को पास कर सकता हूं जिसे मैं लूप कर सकता हूं। विचार?Django रिपोर्ट

+0

मैंने खुद को एक समान लेकिन थोड़ा सरल परिदृश्य में चलाया है जहां मुझे वाई पर श्रेणियों की आवश्यकता थी और एक्स पर श्रेणियों की आवश्यकता थी। इसे कुछ सुंदर क्रूर डेटा मंगिंग के साथ हल किया गया। +1, यह देखने में दिलचस्पी है कि कोई अच्छा समाधान है या नहीं। – Endophage

+0

बीटीडब्ल्यू @ जसोंगोंजलेस, क्या आप कोलंबिया विश्वविद्यालय में काम कर रहे हैं? –

+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 

क्वेरीसेट स्टोर करने के लिए मध्यवर्ती चर बहुत महत्वपूर्ण हैं, क्योंकि वे आपको Django क्वेरीसेट कैश से लाभ प्राप्त करने की अनुमति देते हैं।

Django 1.4 या उससे अधिक के साथ, आप बदल सकते हैं:

locations = Location.objects.all() 

द्वारा:

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

एक गंभीर पर्फ़ बढ़ावा मिलता है।

+0

तो, बस स्पष्ट होने के लिए, क्योंकि मैं एक Django टेम्पलेट में लिख रहा हूं, मुझे शायद उन्हें मुद्रित करने के बजाए मूल्यों को एक धक्का में धक्का देना चाहिए, हां? – jasongonzales

+0

'.order_by ('name') को छोड़कर, आप इसे टेम्पलेट में कर सकते हैं। एचटीएमएल कोड के बीच एक मूल्य मुद्रित करने के लिए बस कोष्ठक को ढीला करें और {{value}} का उपयोग करें। –

संबंधित मुद्दे