如何聚合,即基于查询的属性获取查询集

时间:2020-10-04 14:08:01

标签: python django

我的模特:

class ClinicPermissions(models.Model):
    id = models.AutoField(primary_key=True, unique=True)
    clinicid = models.ForeignKey(Clinic, on_delete=models.CASCADE)
    doctorid = models.ForeignKey(doctor, on_delete=models.CASCADE)
    viewperm_choices = (
        (0, 'Cannot view clinic details'),
        (1, 'Can view clinic details')
    )
    viewperms = models.IntegerField(
        choices=viewperm_choices, default=0)
    editperms_choices = (
        (0, 'Cannot edit clinic details'),
        (1, 'Can edit clinic details')
    )
    editperms = models.IntegerField(
        choices=editperms_choices, default=0)
    editdocs_choices = (
        (0, 'Cannot edit doctor details'),
        (1, 'Can edit doctor details')
    )
    editdocs = models.IntegerField(
        choices=editdocs_choices, default=0)

    class Meta:
        unique_together = ["clinicid", "doctorid"]

以上模型描述了诊所中每个医生的权限。我需要获取与Clinic对象关联的Doctor对象列表,并将其作为查询集存储在ClinicPermissions模型中,并将其传递给表单。

我想去一个特定的诊所。

cl = Clinic.objects.get(id=10)

然后,我想从ClinicPermissions获取医生的查询集,其中临床编号= cl:

即比以下更优雅的东西:

perms = ClinicPermissions.objects.filter(clinicid = cl)
docs = []
for perm in perms:
    docs.append(perm.doctorid)
return docs

在这里,docs是一个列表,但是我需要一个查询集才能传递给表单。

1 个答案:

答案 0 :(得分:4)

简单

Doctor.objects.filter(clinicpermissions__clinicid_id=10)

此处的值 10 Clinic 对象的PK

参考


作为一个补充说明,在Django中,由于Django内部对其进行处理,因此我们不会将id作为字段的后缀。同样,Django也处理Primary field,因此无需显式定义PK。

class ClinicPermissions(models.Model):
    id = models.AutoField(primary_key=True, unique=True)
    clinic = models.ForeignKey(Clinic, on_delete=models.CASCADE)
    doctor = models.ForeignKey(Musician, on_delete=models.CASCADE)
    # rest of the fields