簡體   English   中英

Select 與 Django 的多個反向外鍵相關和預取相關?

[英]Select related and prefetch related for multiple reverse foreign keys with Django?

我目前在訪問查詢集中的值時遇到問題。 我的應用程序有一個 models.py,設置如下:

class Company(models.Model):
    name = models.Charfield(max_length=250)

class Patient(models.Model):

        status_choices = [
        ('A', 'Current Admission'),
        ('D', 'Discharged'),
        ('U', 'Unknown'),
    ]

    first_name = models.CharField(max_length=250)
    last_name = models.CharField(max_length=250)
    patient_status = models.CharField(
        max_length=15,
        choices=status_choices,
        null=True, default='U',
        verbose_name='Patient Status'
    )
    related_company = models.ForeignKey(Company, on_delete=models.CASCADE, related_name='patients')

class PatientStay(models.Model):
    admit_date = models.DateField()
    projected_dc_date = models.DateField(null=True, blank=True)
    is_active = models.BooleanField(default=False)
    stay_to_patient_relationship = models.ForeignKey(Patient, on_delete=models.CASCADE, related_name='stays')
    
class PatientLOC(models.Model):
    loc_to_stay_relation = models.ForeignKey(PatientStay, on_delete=models.CASCADE, related_name='locs')
    level_of_care = models.CharField(max_length=30)
    loc_start = models.DateField(null=True)
    loc_end = models.DateField(null=True, blank=True)
    is_active = models.BooleanField(default=False)

我想要做的是查詢這個以獲取(對於特定公司)患者、他們的相關停留時間(過濾為僅活動)以及他們相關的 PatientLOC。

像這樣的結果:

  • 公司:
  • -病人
  • - 停留
  • ---LOC的
  • -病人
  • - 停留
  • ---LOC的
  • -病人
  • - 停留
  • ---LOC的

我想出了這個(少過濾):

company = Company.objects.select_related().prefetch_related('patients__stays', 'patients__stays__locs').get(id=2)

我可以循環並得到病人和停留,但我似乎無法為這些病人到達 LOC。 所以,我可以做這樣的事情:

company = Company.objects.select_related().prefetch_related('patients__stays', 'patients__stays__locs').get(id=2)

patients = company.patients.all()

for patient in patients:
    ...:     print(patient)
    ...:     print(patient.stays.all())

但是這樣的事情是行不通的:

company = Company.objects.select_related().prefetch_related('patients__stays', 'patients__stays__locs').get(id=2)
patients = company.patients.all()

for patient in patients:
     ...:     print(patient)
     ...:     for stay in patient.stays.all():
     ...:         print(stay)
     ...:         for loc in patient.stays.locs.all():
     ...:             print(loc)

除了我使用一堆嵌套的 for 循環之外,最好的方法是什么? 有沒有辦法在偽代碼中像這樣遍歷患者:

for patient in patients:
    print(patient)
    print(patient.stay)
    print(patient.stay.loc)

我已經為此苦苦掙扎了一段時間,而且我沒有猜測。 該文檔將我帶到了 select_related 和 prefetch_related (我確定我以某種方式錯誤地使用了它們)。

任何幫助將不勝感激,謝謝。

您可以嵌套預取調用:

from django.db.models import Prefetch
patients = Patient.objects.filter(company__id=2).prefetch_related(
   Prefetch(
      'stays',
      queryset=PatientStay.objects.prefetch_related('locs')
   ))

for patient in patients:
   print(patient)
   print([stay for stay in patient.stays.all()])
   print([loc for stay in patient.stays.all() for loc in stay.locs.all()])

暫無
暫無

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

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