2013-11-28 3 views
25

Ich bin ziemlich neu in Django, und nicht zu sehr mit MVC, DB Abfragen.Django: Wie schreibe ich Abfrage zu sortieren mit mehreren Spalten, Anzeige über Vorlage

Ich habe eine Customer-Tabelle, die customer_name, city_name, sowie ein state_name (aus einer Fremdschlüsseltabelle gezogen) enthält. Im HTML versuche ich, die Ergebnisse in einer Liste anzuzeigen, die zuerst alphabetisch nach state_name, dann nach city_name und dann nach customer_name sortiert wird. Wie so ..

ARIZONA 
    PHOENIX 
    AAA, Inc. 
    BBB, LLC. 

    SCOTTSDALE 
    AAA, LLC. 
    DDD, Corp. 

CALIFORNIA 
    ANAHEIM 
    ... 

Mein model.py wie folgt:

from django.db import models 

class Customer(models.Model): 
    def __unicode__(self): 
     return self.customer_name 

    customer_name = models.CharField(max_length=60) 
    city_name = models.CharField(max_length=30) 
    state = models.ForeignKey('State') 

class State(models.Model): 
    def __unicode__(self): 
     return self.state_name 

    state_name = models.CharField(max_length=20) 
    state_code = models.CharField(max_length=2) 

In meinem urls.py, ich habe:

url("^customers/$", 
    direct_to_template, 
    {'template': 'pages_fixed/customers.html', 
    'extra_context': {'customers': Customer.objects.all().order_by('state')}}, 
    name='customers'), 

Und in meinem HTML, habe ich eine Arbeitsvorlage als:

<div class='customers'> 
     {% for customer in customers %} 
      <div class='block_customer'> 
       <p>{{ customer.state.state_name }}</p> 
       <p>{{ customer.city_name }}</p> 
       <p>{{ customer.customer_name }}</p> 
      </div> 
     {% endfor %} 
    </div> 

Es ist alles Art von arbeiten bu t offensichtlich nicht richtig sortiert und ich bin mir nicht sicher, was der beste Weg ist, es zu entwerfen. Ich probierte einige innere Schleifen mit den Vorlagen aus, hoffte, dass die Vorlagen einige Sortierregeln definieren würden, aber dies scheint nicht unterstützt/korrekt zu sein. Ich vermute, dass ich die Daten anders abfragen oder vorab im Code vorsortieren muss? Ich bin mir nicht sicher, ob dies in der View (was ist Djangos Controller-Form?) Geschehen würde. Wenn mir jemand in die richtige Richtung zeigen könnte, wäre das sehr dankbar!

Antwort

49

Es gibt mehrere Ebenen für die Anzeige Modelle Objekte in Vorlage bestellt, die jeweils die vorherige Ebene überschreiben:

  1. (MODEL LEVEL) Meta-Attribut ordering wie zeigt @Bithin in seiner Antwort (mehr auf django docs)
  2. (vIEW LEVEL) QuerySet order_by Methode wie Sie in Ihrer Ansicht Beispiel versucht haben, das würde wie Sie arbeitet wa nt, wenn hinzufügen andere Felder zu sortieren:

    Customer.objects.order_by('state', 'city_name', 'customer_name')

    (mehr auf django docs). Beachten Sie, dass .all() hier nicht benötigt wird.

  3. (TEMPLATE LEVEL) regroup Template-Tag Notwendigkeit in Ihrer Probe verschachtelt verwenden (mehr auf django docs)
+0

So ist es eine Möglichkeit, diesen Fall unempfindlich zu machen, mit mehreren Spalten, bei die Ansichtsebene? Ich kann die Syntax dafür nicht finden. Ich weiß, dass "Lower" die Groß- und Kleinschreibung unempfindlich macht, aber ich kann diese Arbeit nicht auf mehrere Spalten anwenden. – Ben

12

Sie können die Reihenfolge innerhalb des Modells angeben,

class Customer(models.Model): 

    customer_name = models.CharField(max_length=60) 
    city_name = models.CharField(max_length=30) 
    state = models.ForeignKey('State') 

    def __unicode__(self): 
     return self.customer_name 

    class Meta: 
      ordering = ['customer_name', 'city_name', 'state'] 

Hoffnung, das hilft.

Verwandte Themen