2010-11-26 2 views
1

Так что это один немного странно, чтобы описать, пожалуйста, медведь со мной :) Попытка объяснить без кода не имеет смысла, так вот краткий пример:Джанго «CONCAT» запрос устанавливает

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) 

Давайте скажем, мы хотим распечатать каждого сотрудника в конкретной компании через шаблон. Обычно мы просто не будем делать этого:

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

Который работает замечательно, но в данном случае я хотел бы напечатать заголовок в верхней части списка сотрудников, если есть сотрудники, но оставить от заголовка, если нет сотрудников. В типичном цикле я использую forloop.first, чтобы указать, что заголовок должен быть показан, но в этом случае я не могу. Если я попробую его во внешнем цикле (местоположениях), я могу получить заголовок, когда не будут присутствовать сотрудники, если я попробую его во внутреннем цикле (сотрудники), я получу заголовок для местоположений с сотрудниками, но я получу один заголовок на место вместо одного для всего списка.

Теперь мое идеальное решение для этого было бы пропустить шаг все вместе и иметь некоторый способ перебора всех сотрудников от уровня компании:

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

Где employees на уровне компании, по существу, конкатенация запроса сотрудников для каждого местоположения. Я просмотрел пользовательские менеджеры, но я не уверен, как их использовать в этом сценарии.

Надеюсь, это имеет смысл. Спасибо за любые предложения!

ответ

4

Вы можете просто сделать запрос (в представлении) наоборот, чтобы получить один QuerySet всех сотрудников компании:

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

Это имеет дополнительное преимущество только требует один хит базы данных , а не по одному на каждое место.

+0

Спасибо! Это на самом деле произошло со мной примерно через 2 минуты после написания вопроса, я только что рассматривал проблему назад, полагаю! Еще одно замечание, в моем случае я фактически добавил это как функцию для своего класса Model, что позволяет мне называть его точно так же, как описано выше в шаблоне ('company.employees'). – Toji

Смежные вопросы