我正在尝试使用现有的Django功能/命令实现OUTER JOIN
功能。
我有这个型号:
class ClinicDoctor(models.Model):
doctor = models.ForeignKey('User', related_name='doctorsF') # single quotes (') because User table is defined down the code.
clinic = models.ForeignKey(Clinic, related_name='clinicsF')
和
class User(AbstractUser):
clinics = models.ManyToManyField(Clinic, through='ClinicDoctor', related_name='doctors')
我需要获得所有医生以及相关诊所的清单。如果他们有与之相关的诊所,我可以获得清单。但我无法让没有诊所的医生与他们联系起来。
我试过了:
doctorsQuerySet = ClinicDoctor.objects.filter(doctor__groups__name='Doctor').distinct()
它不起作用,因为它有点INNER JOIN
这个查询会给我所有的医生。但我不知道是谁继续取得所有医生,无论是诊所协会。
doctorsQuerySet = User.objects.filter(groups__name='Doctor').order_by('full_name')
我必须和医生一起展示诊所,如果有的话。它似乎是与OUTER JOIN
类似的功能。我们如何在Django中做到这一点?
谢谢。
答案 0 :(得分:0)
如果您将医生定义为分配给“医生”组的用户,则第一个查询是正确的:
doctorsQuerySet = User.objects.filter(groups__name='Doctor').order_by('full_name')
通过使用循环,您现在可以克服每个用户并阅读与诊所相关的数据。
for doctor in doctorsQuerySet:
clinics = doctor.clinics.all()
由于这会在每次迭代时引起额外的查询,您应该考虑在查询中使用预取:
doctorsQuerySet = User.objects.filter(groups__name='Doctor').prefetch_related('clinics').order_by('full_name')
希望这会有所帮助:)