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

2024-10-01 00:17:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用现有的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怎么做

谢谢你


Tags: djangoname功能modelsclass医生outerjoin
1条回答
网友
1楼 · 发布于 2024-10-01 00:17:53

如果将医生定义为分配给“医生”组的用户,则第一个查询是正确的:

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

希望这有帮助:)

相关问题 更多 >