Как объединить модели в модели 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()