Как я могу преобразовать этот SQL-запрос в оператор Django ORM? - PullRequest
0 голосов
/ 17 июня 2019

У меня есть 3 модели:

#Appointment
class Appointment(models.Model):
    doctor = models.ForeignKey(
        Doctor,
        on_delete=models.CASCADE,
        related_name='doctor_appointment')
    patient = models.ForeignKey(
        Patient,
        on_delete=models.CASCADE,
        related_name='patient_appointment')
    scheduled = models.DateTimeField(auto_now_add=True)

# Doctor
class Doctor(models.Model):
    user_id = models.TextField(unique=True)
    first_name = models.CharField(max_length=100, blank=False)
    last_name = models.CharField(max_length=100, blank=False)

# Patients
class Patient(models.Model):
    user_id = models.TextField(unique=True)
    first_name = models.CharField(max_length=100, blank=False)
    last_name = models.CharField(max_length=100, blank=False)

И я хочу выполнить следующий запрос, используя Django ORM:

SELECT 
d.first_name,
d.last_name,
d.specialty,
d.address,
a.scheduled

FROM appointment as a

LEFT JOIN patient as p ON p.id=a.patient_id

LEFT JOIN doctor as d ON d.id = a.doctor_id

WHERE p.user_id  = '12345';

Я пришел с этим утверждением:

ret = Appointment.objects.filter(patient__user_id='12345').values_list('doctor__first_name', 'doctor__last_name', 'scheduled')

но после изучения его необработанного запроса (ret.query) я могу видеть, что это переводится в набор INNER JOINS.

Есть ли способ получить запрос, который я хочу?

1 Ответ

1 голос
/ 17 июня 2019

Вы должны избегать мышления в терминах SQL-запросов;смысл ORM в том, что он основан на объекте .

По той же причине избегайте таких вещей, как values_list, если только вы действительно не знаете, что вам нужен список.Вам следует запросить объекты «Назначение» и связанные с ними объекты «Доктор» и «Пациент».

Что вам действительно нужно сделать, так это просто отфильтровать назначения и использовать select_related для запроса связанных моделей.Затем Django поступит правильно, используя INNER JOIN или LEFT JOIN, в зависимости от того, разрешены ли нулевые значения.

Так, например:

Appointment.objects.filter(patient__user_id='12345').select_related('patient', 'doctor')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...