Так что это один немного странно, чтобы описать, пожалуйста, медведь со мной :) Попытка объяснить без кода не имеет смысла, так вот краткий пример:Джанго «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
на уровне компании, по существу, конкатенация запроса сотрудников для каждого местоположения. Я просмотрел пользовательские менеджеры, но я не уверен, как их использовать в этом сценарии.
Надеюсь, это имеет смысл. Спасибо за любые предложения!
Спасибо! Это на самом деле произошло со мной примерно через 2 минуты после написания вопроса, я только что рассматривал проблему назад, полагаю! Еще одно замечание, в моем случае я фактически добавил это как функцию для своего класса Model, что позволяет мне называть его точно так же, как описано выше в шаблоне ('company.employees'). – Toji