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:
- (NIVEL DE MODELO) El
ordering
atributos de meta como muestra @Bithin en su respuesta ( más sobre los documentos de django ) (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í.- (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.