Wie viele zu viele Django REST aktualisieren?

stimmen
2

Wie würde ich mich über eine viele zu viele Beziehung in Django REST Rahmen zu aktualisieren?

Hier ist mein Modell.

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

Hier ist mein Serializer:

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

Wie erreiche ich die Aktualisierung subjects? Derzeit kann ich nur hinzufügen , und nicht vorhandene Themen löschen.

Veröffentlicht am 19/12/2018 um 14:09
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
0

Hier ist eine Abhilfe. Ich möchte aber jemand würde eine bessere Antwort schreiben. Die Idee dabei ist , alle Themen zu löschen , zuerst dann sie hinzufügen. Da natürlich können wir jedoch nicht tun teacher.subjects.all().delete(), was wir tun können

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

    for subject in subjects:
        teacher.subjects.add(subject)
Beantwortet am 19/12/2018 um 16:30
quelle vom benutzer

stimmen
0

Da wir über many-to-many sprechen, müssen beide Objekte beibehalten werden, bevor Sie sie einander zuordnen können.

Sobald Sie das haben, können Sie einfach ein in die bezüglich der Sammlung des anderen hinzuzufügen, wie dieser (Quelle: 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)

Oder in einem Schritt:

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

Ich habe nicht herausgefunden, wie zum Ausdruck bringt „enthält“ noch nicht, aber der nächste Schritt ist es, die Themen zu entfernen, die nicht in der neuen Liste sind und diejenigen hinzufügen, die in den neuen, aber nicht die alten Liste. Wahrscheinlich effizienter mit sortierten Listen oder besser Hashes. Aber mein Python ist nicht gut genug für die noch.

Beantwortet am 19/12/2018 um 14:55
quelle vom benutzer

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