2010-11-26 6 views
1

donc celui-ci est un peu bizarre pour décrire, s'il vous plaît garder avec moi :) Essayer d'expliquer sans code ne sera pas beaucoup de sens alors voici un bref exemple:Django « concat » requête définit

class Employee(models.Model): 
    name = models.CharField(max_length=100) 

class Location(models.Model): 
    address = models.CharField(max_length=200) 
    employees = models.ForeignKey(Employee) 

class Company(models.Model): 
    name = models.CharField(max_length=100) 
    locations = models.ForeignKey(Location) 

Entre Nous disons que nous voulons imprimer chaque employé dans une entreprise donnée via un modèle. Normalement, nous voulons juste faire:

{% for location in company.locations.all %} 
    {% for employee in location.employees.all %} 
     {{ employee.name }} <br/> 
    {% endfor %} 
{% endfor %} 

Ce qui fonctionne très bien, mais dans ce cas, je voudrais imprimer un en-tête en haut de la liste des employés s'il y a des employés, mais s'arrêter l'en-tête si aucun employé n'est présent. Dans une boucle typique j'utilise forloop.first pour indiquer que l'en-tête devrait être montré, mais dans ce cas je ne peux pas. Si je l'essaie dans la boucle externe (emplacements), je peux obtenir un en-tête quand aucun employé n'est présent, si je l'essaie dans la boucle interne (employés) Je vais seulement obtenir l'en-tête pour les emplacements avec les employés, mais je vais un en-tête par emplacement au lieu d'un seul pour la liste entière.

Maintenant, ma solution idéale à ce serait de sauter une étape tous ensemble et avoir un moyen de parcourir tous les employés du niveau de l'entreprise:

{% for employee in company.employees %}...{% endfor %} 

employees au niveau de l'entreprise est essentiellement une concaténation de la requête des employés définie pour chaque emplacement. J'ai regardé dans les gestionnaires de coutume, mais je ne suis pas sûr de savoir comment les utiliser dans ce scénario.

J'espère que cela a du sens. Merci pour vos suggestions!

Répondre

4

Vous pouvez juste faire la requête (dans la vue) dans l'autre sens pour obtenir un queryset de tous les employés d'une entreprise:

employees = Employee.objects.filter(location__company=company) 

Cela a l'avantage de ne nécessiter un coup unique de base de données , plutôt qu'un par endroit.

+0

Merci! Cela m'est effectivement arrivé environ 2 minutes après avoir rédigé la question, je venais de regarder le problème en arrière, je suppose! Une note supplémentaire, dans mon cas, j'ai ajouté ceci en tant que fonction à ma classe Model, ce qui me permet de l'appeler exactement comme je l'ai décrit plus haut dans le template ('company.employees'). – Toji