繁体   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