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é!
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.
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.