Как объединить модели в модели django подобно sql

У меня есть три модели, которые не содержат внешних ключей

class SchoolReg(models.Model):
    # TODO: Define fields here
    user = models.ForeignKey('front.User', on_delete= models.CASCADE)
    fullname = models.CharField(max_length= 100)
    dob = models.CharField(max_length= 50)

class CandidateCode(models.Model):
    candidateCode = models.IntegerField()
    regId = models.IntegerField()
    regCategory = models.CharField(max_length=20)

class Sec1(models.Model):
    user = models.ForeignKey(User, on_delete = models.CASCADE, blank= True, null = True)
    centreName = models.CharField(max_length= 50, blank= True, null = True)
    compRegNo = models.CharField(max_length= 50, blank= True, null = Tru

Теперь я хочу объединить эти модели и сделать набор студентов следующим образом

SELECT * from school_reg s
LEFT JOIN sec1 c on s.user_id = c.user_id
LEFT JOIN candidate_code cc on cc.reg_id = s.school_id
WHERE c.center_name = "centreName"

Вам необходимо указать отношение в операторе фильтрации согласно документации.

В этом ответе stack overflow даже есть отличное предложение использовать метод .query() для обратного поиска, который вам нужен.

Мы не можем использовать select_related(), потому что у нас нет внешнего ключа, поэтому в этот раз мы используем сырой sql Выполнение необработанных запросов

Я использую это для решения

from django.db import connection
with connection.cursor() as cursor:
    cursor.execute("""SELECT s.id, s.dob, cc.candidateCode, s.fullname,  
    q.title, e.examDate, c.centreName from lrnadmin_schoolreg s
    LEFT JOIN lrnadmin_bookingexam e on s.exam_id = e.id
    LEFT JOIN front_sec1 c ON s.user_id = c.user_id
    LEFT JOIN lrnadmin_qualification q ON q.id = s.qualification_id
    LEFT JOIN lrnadmin_candidatecode cc ON cc.regId = s.id
    WHERE c.id = %s""", [request.POST['centre']])
row = cursor.fetchall()
Вернуться на верх