tutorial español python django postgresql sorting django-queryset

python - español - Django: Cómo escribir una consulta para ordenar usando múltiples columnas, mostrar a través de la plantilla



django tutorial (3)

Hay varios niveles para visualizar objetos de modelos ordenados en la plantilla, cada uno sobrescribe el nivel anterior:

  1. (NIVEL DE MODELO) El ordering atributos de meta como muestra @Bithin en su respuesta ( más sobre los documentos de django )
  2. (VER NIVEL) QuerySet order_by método como lo ha intentado en su ejemplo de vista, que funcionaría como lo desea si agrega otros campos para ordenar:

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

    ( más sobre los documentos de django ). Tenga en cuenta que .all() no es necesario aquí.

  3. (NIVEL DE PLANTILLA) la etiqueta de plantilla de regroup debe usarse anidada en su muestra ( más en los documentos de django )

Soy bastante nuevo en Django y no tengo mucha experiencia con las consultas de MVC y DB.

Tengo una tabla de clientes que incluye customer_name, city_name, así como un state_name (extraído de una tabla de clave externa). En el HTML, intento mostrar los resultados en una lista ordenada alfabéticamente por state_name, luego por city_name, luego por customer_name name. Al igual que..

ARIZONA PHOENIX AAA, Inc. BBB, LLC. SCOTTSDALE AAA, LLC. DDD, Corp. CALIFORNIA ANAHEIM ...

Mi model.py es el siguiente:

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)

En mi urls.py, tengo:

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

Y en mi HTML, tengo una plantilla en funcionamiento como:

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

Todo está funcionando, pero obviamente no está ordenando correctamente y no estoy seguro de cuál es la mejor manera de diseñarlo. Probé algunos bucles internos con las plantillas, esperaba que las plantillas me permitieran definir algunas reglas de ordenación, pero esto no parece ser compatible / correcto. ¿Sospecho que tengo que consultar los datos de manera diferente o ordenarlos previamente en el código con anticipación? No estoy seguro de si esto se haría en la Vista (¿cuál es la forma de controlador de Django?). Si alguien pudiera indicarme la dirección correcta, ¡eso sería MUCHO apreciado!


Puede especificar el orden dentro del modelo,

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

Espero que esto ayude.


Si desea ordenar por algún campo del modelo "maestro", en este caso, debe escribir algo como esto:

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

Eche un vistazo a state__state_name, double _ después del primer estado, haga acceso al campo de ese modelo.