Django "concat" наборы запросов - PullRequest
       8

Django "concat" наборы запросов

1 голос
/ 26 ноября 2010

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

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 на уровне компании - это, по сути, объединение запросов сотрудников, установленных для каждого местоположения. Я изучил собственные менеджеры, но не уверен, как их использовать в этом сценарии.

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

1 Ответ

4 голосов
/ 26 ноября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...