Django:返回匹配和不匹配的记录

时间:2018-02-04 10:40:02

标签: python django

我正在尝试使用现有的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中做到这一点?

谢谢。

1 个答案:

答案 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')

希望这会有所帮助:)