[英]Select related and prefetch related for multiple reverse foreign keys with Django?
I'm currently having issues accessing values in a queryset.我目前在访问查询集中的值时遇到问题。 I have a models.py for my app that is set up like this:我的应用程序有一个 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)
What I am trying to do is query this to get (for a particular company) the patients, their related stay (filtered for only active), and their related PatientLOC.我想要做的是查询这个以获取(对于特定公司)患者、他们的相关停留时间(过滤为仅活动)以及他们相关的 PatientLOC。
A result like this:像这样的结果:
I have come up with this (less the filtering):我想出了这个(少过滤):
company = Company.objects.select_related().prefetch_related('patients__stays', 'patients__stays__locs').get(id=2)
Which I can loop through and get the patient and the stays, but I cannot seem to get to the LOC's for those patients.我可以循环并得到病人和停留,但我似乎无法为这些病人到达 LOC。 So, I can do something like this:所以,我可以做这样的事情:
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())
But something like this will not work:但是这样的事情是行不通的:
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)
Outside of the fact I am using a bunch of nested for loops, what is the best way to do this?除了我使用一堆嵌套的 for 循环之外,最好的方法是什么? Is there a way to just loop over the patients like this in psuedocode:有没有办法在伪代码中像这样遍历患者:
for patient in patients:
print(patient)
print(patient.stay)
print(patient.stay.loc)
I've been struggling with this for a while now and I'm out of guesses.我已经为此苦苦挣扎了一段时间,而且我没有猜测。 The documentation led me to the select_related and prefetch_related (which I'm sure I am using incorrectly in some way).该文档将我带到了 select_related 和 prefetch_related (我确定我以某种方式错误地使用了它们)。
Any help would be appreciated, thank you.任何帮助将不胜感激,谢谢。
You can nest prefetch calls:您可以嵌套预取调用:
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.