Упростите запрос, охватывающий несколько объектов

Я пытаюсь отфильтровать человеческий запрос на основе того, какими отделами управляет запрашивающий пользователь.

Андо (пример Человека) управляет тремя отделами. Я хочу вернуть всех людей из этих трех отделов.

У людей может быть несколько контрактов. Каждый контракт прикрепляет человека к отделу:

class Contract(models.Model):
human = models.ForeignKey(Human, related_name='contracts', on_delete=models.CASCADE)
department = models.ForeignKey(ShowDepartment, related_name='contracts', on_delete=models.CASCADE)

То, что у меня ниже, работает, но я уверен, что есть более эффективный способ сделать этот запрос.

output_humans = []
depts = self.request.user.human_profile.departments_managed()
for d in depts:
    contracts = Contract.objects.filter(department=d)
    for c in contracts:
        if c.human not in output_humans:
            output_humans.append(c.human)
1
0
25
1

Ответы 1

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

Здесь y9ou интересуют Human, поэтому мы можем запросить:

output_humans = Human.objects.filter(contracts__department__in=depts).distinct()

Таким образом, мы можем опустить циклы (по depts и contracts), а также запрос Contract.

Таким образом, нам требуется distinct() (например, если не возвращать такой жеHuman несколько раз), для которого хотя бы один из их Contract находится в Department в depts.

Спасибо за быстрый ответ. Имеет смысл, и я буду использовать его еще много раз.

Brandon Keller 10.08.2018 15:15

Другие вопросы по теме