web-dev-qa-db-fra.com

Django: Comment écrire une requête pour trier en utilisant plusieurs colonnes, afficher via un modèle

Je suis assez nouveau sur Django et je n’ai pas trop d’expérience avec les requêtes MVC, DB. 

J'ai une table de clients qui comprend nom_du_client, nom de la ville, ainsi qu'un nom de l'état (extraite d'une table de clé étrangère). Dans le code HTML, j'essaie d'afficher les résultats dans une liste d'abord triée alphabétiquement par nom d'état, puis par nom de ville, puis par nom de client. Ainsi..

ARIZONA
   PHOENIX
     AAA, Inc.
     BBB, LLC.

   SCOTTSDALE
     AAA, LLC.
     DDD, Corp.

CALIFORNIA
   ANAHEIM
     ...

Mon model.py est comme suit:

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)

Dans mon urls.py, j'ai:

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

Et dans mon HTML, j'ai un modèle de travail comme:

    <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>

Tout cela fonctionne, mais évidemment, le tri n'est pas correct et je ne suis pas sûr de la meilleure façon de le concevoir. J'ai essayé des boucles internes avec les modèles, espérant que les modèles me permettraient de définir des règles de tri, mais cela ne semble pas être pris en charge/correct. Je soupçonne d’avoir besoin d’interroger les données différemment ou de les pré-trier dans le code à l’avance? Je ne sais pas si cela se ferait dans View (quelle est la forme de contrôleur de Django?). Si quelqu'un pouvait me diriger dans la bonne direction, ce serait BEAUCOUP apprécié! 

33
pete

Vous pouvez spécifier l'ordre dans le modèle, 

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']

J'espère que cela t'aides.

12
Bithin

Si vous voulez commander par un champ du modèle "maître", dans cet état de cas, vous devez écrire quelque chose comme ceci:

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

Jetez un coup d'œil à state__state_name, le double _ après le premier état, permet d'accéder au champ de ce modèle.

0
DanielB