Comment mettre à jour plusieurs à plusieurs Django REST?

voix
2

Comment pourrais-je aller à mettre à jour un grand nombre à plusieurs dans les framework Django REST?

Voici mon modèle.

class SchoolTeacher(AbstractBase):
    school = models.ForeignKey(School, on_delete=models.CASCADE, 
         related_name='teachers')
    user = models.ForeignKey(User, on_delete=models.CASCADE, 
         related_name='teacher_at',)
    subjects = models.ManyToManyField(SchoolSubject, 
        related_name='teachers')

Voici mon sérialiseur:

class SchoolTeacherSerializer(serializers.ModelSerializer):
   ....
   def create(self, validated_data):
    school_class = validated_data.get('school_class', None)
    stream = validated_data.get('stream', None)

    school_teacher_model_fields = [
        f.name for f in SchoolTeacher._meta.get_fields()]
    valid_teacher_data = {
        key: validated_data[key]
        for key in school_teacher_model_fields
        if key in validated_data.keys()
    }
    subjects = valid_teacher_data.pop('subjects')
    teacher = SchoolTeacher.objects.create(**valid_teacher_data)

    for subject in subjects:
        teacher.subjects.add(subject)

    self.add_class_teacher(stream, school_class, teacher)

    return teacher

def update(self, instance, validated_data):
    subjects = validated_data.pop('subjects')
    school_class = validated_data.get('school_class', None)
    stream = validated_data.get('stream', None)
    teacher = instance

    for (key, value) in validated_data.items():
        setattr(teacher, key, value)

    for subject in subjects:
        teacher.subjects.add(subject)

    teacher.save()

    return teacher

Comment puis-je obtenir la mise à jour subjects? À l' heure actuelle, je ne peux ajouter et supprimer des sujets non existants.

Créé 19/12/2018 à 14:09
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
0

Voici une solution de contournement. Je souhaite cependant que quelqu'un afficherait une meilleure réponse. L'idée ici est de supprimer tous les sujets d' abord , puis les ajouter. Cependant, étant donné que nous ne pouvons pas bien sûr teacher.subjects.all().delete(), nous pouvons faire

    for existing_subject in teacher.subjects.all():
        teacher.subjects.remove(existing_subject)

    for subject in subjects:
        teacher.subjects.add(subject)
Créé 19/12/2018 à 16:30
source utilisateur

voix
0

Comme nous parlons de beaucoup à beaucoup, les deux objets doivent être persisté avant de pouvoir les affecter à l'autre.

Une fois que vous avez, vous pouvez simplement ajouter un à la collection en ce qui concerne de l'autre, comme celui - ci (source: https://docs.djangoproject.com/en/2.1/topics/db/examples/many_to_many/ ):

a1 = Article(headline='Django lets you build Web apps easily')
a1.save()
p1 = Publication(title='The Python Journal')
p1.save()
a1.publications.add(p1)

Ou, en une seule étape:

new_publication = a1.publications.create(title='Highlights for Children')

Je ne l'ai pas trouvé comment exprimer « contains » encore, mais l'étape suivante consiste à éliminer les sujets qui ne sont pas dans la nouvelle liste et ajouter ceux qui sont dans la nouvelle, mais pas la liste ancienne. Probablement plus efficace des listes triées ou mieux hash. Mais mon python est pas assez bon pour encore.

Créé 19/12/2018 à 14:55
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more