Как агрегировать, то есть получать наборы запросов на основе свойства запроса

#python #django

#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"]
  

Приведенная выше модель описывает разрешения каждого врача в клинике. Мне нужно получить список объектов doctor, связанных с объектом Clinic, который хранится в модели ClinicPermissions, в виде набора запросов и передать его в форму.

то есть

Я хочу получить конкретную клинику.

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

Затем я хочу получить набор запросов врачей из ClinicPermissions, где clinicid = cl:

то есть что-то более элегантное, чем следующее:

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

Здесь docs — это список, но мне нужен набор запросов для передачи в форму.

Комментарии:

1. perms = ClinicPermissions.objects.filter(clinicid = cl).values(‘doctorid’) ?

Ответ №1:

Просто

 Doctor.objects.filter(clinicpermissions__clinicid_id=10)  

Здесь значением 10 является PK Clinic объекта

Ссылка


В качестве примечания, в Django мы не будем использовать id в качестве суффикса к полям, поскольку Django внутренне обрабатывает то же самое. Аналогично, Django также обрабатывал основное поле, следовательно, нет необходимости определять 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