Как получить object_set в сериализаторе от многих ко многим? - PullRequest
0 голосов
/ 27 апреля 2020

Я хочу разрешить сохранение определенного поля c, только если оно отвечает на какое-то утверждение. Позвольте мне объяснить.

models.py

class classe(models.Model):
   name = models.CharField(max_length=191)
   groups = models.ManyToManyField('Group')
   persons = models.ManyToManyField('Person')

class Group(models.Model):
   name = models.CharField(max_length=191)
   persons = models.ManyToManyField('Person')

class Person:
   name = models.CharField(max_length=191)

serializers.py

class GroupSerializer(serializers.ModelSerializer):
    persons = PersonSerializer(many=True, read_only=True)
    person_id = serializers.PrimaryKeyRekatedField(queryset=Person.objects.all(), write_only=True)

    def update(self, instance, validated_data, **kwargs):
        instance.name = validated_data.get('name', instance.name)
        person_field = validated_data.get('person_id)
        classe = instance.classe_set #This one doesn't work
        person_classe = classe.persons.all() #This one too
        if (person_field in person_classe):
            instance.persons.add(person_field)
        instance.save()
        return instance

Таким образом, person_field может быть сохранено, только если человек находится в фактическом classe .

Все работает нормально, но две прокомментированные строки этого не делают, поэтому не могут получить доступ к оператору if.

Кто-то знает как я могу это понять?

1 Ответ

0 голосов
/ 27 апреля 2020

Потому что Group и Classe - это ManyToManyfield друг с другом; поэтому группа может иметь много классов, а класс может иметь много групп.

Поэтому, чтобы получить список классов группы:

classes = list(mygroup.classe_set.all())

Я полагаю, что в вашей функции обновления вы пытаетесь добавить человека в группу, если он в классах, связанных с этой группой. Если да, вот что вам нужно:

# first get all the associated Classe, you need the '.all()'
# keep in mind that .all() gives you a queryset
classes = instance.classe_set.all()
for c in classes:
    students = c.persons.all() # persons of a classe of this group
    if students.filter(id=person_field.id).exists():
        # if this person is in the persons of this classe of this group
        # then we add this person to this group
        instance.persons.add(person_field)
        break # we only need to add it once, right? 

Надеюсь, это поможет!

...