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 %}

не самый красивый, но он работает... Я бы все равно согласился на более элегантное решение.

Вернуться на верх