DJANGO Дополнение к списку данных через промежуточную таблицу
У меня есть соединение промежуточных моделей
Упрощенно:
Person table:
first_name
last_name
Company table:
company_name
CompanyEnrollment table:
FK Person
FK Company
Я хочу создать следующий массив:
datas = Person.objects.All(...{All elements of Person supplemented with Company_name}...)
Есть случай, когда у человека нет ассоциации company_name. Возможно ли решить это с помощью запроса?
Если у вас есть явная through модель для отношения "многие-ко-многим", вы можете использовать ее для получения или исключения только на основе записей этой таблицы, используя предложение Exists:
enrollments = CompanyEnrollment.objects.filter(person_id=OuterRef('pk'))
enrolled_persons = Person.objects.filter(Exists(enrollments))
unenrolled_persons = Person.objects.filter(~Exists(enrollments))
Если у вас нет явной промежуточной таблицы, значит, она была сгенерирована Django напрямую. Вы должны иметь возможность использовать ее, ссылаясь на нее с помощью Person.enrollments.through вместо CompanyEnrollment.
Поскольку вы не очень подробно описали таблицу CompanyEnrollment, я предположил, что вы находитесь во втором случае.
Это не лучшее решение, на мой взгляд, но оно работает пока, с небольшим количеством данных. Я думаю, что это медленное решение для большого количества данных.
views.py я скомпилирую два необходимых словаря
datas = Person.objects.all().order_by('last_name', 'first_name')
companys = CompanyEnrollment.objects.all()
Использовать пагинатор
p = Paginator(Person.objects.all(), 20)
page = request.GET.get('page')
pig = p.get_page(page)
pages = "p" * pig.paginator.num_pages
Render HTML:
context = {
"datas": datas,
"pig": pig,
"pages": pages,
"companys": companys,
}
return render(request, "XY.html", context)
HTML шаблон:
{% for datas in pig %}
{{datas.first_name}} {{datas.last_name}}
{% for company in companys %}
{% if datas == company.person %}
{{company.company.name}} <br>
{% endif %}
{% endfor %}
{% endfor %}
не самый красивый, но он работает... Я бы все равно согласился на более элегантное решение.