簡體   English   中英

如何將該SQL查詢轉換為Django ORM語句?

[英]How can I convert this SQL query to a Django ORM statement?

我有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

有沒有辦法獲取我想要的查詢?

您應該避免考慮SQL查詢。 ORM的要點是它是基於對象的。

出於同樣的原因,請避免使用values_list類的values_list除非您真的知道自己需要一個列表。 您應該詢問約會對象及其相關的Doctor和Patient對象。

您真正需要做的只是過濾約會,並使用select_related來查詢相關模型。 然后,Django將使用INNER JOIN或LEFT JOIN做正確的事情,這取決於是否允許空值。

因此,例如:

Appointment.objects.filter(patient__user_id='12345').select_related('patient', 'doctor')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM