![](/img/trans.png)
[英]Django: Prefetch Related multiple reverse relationships
[英]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。
像這樣的結果:
我想出了這個(少過濾):
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.