如何更新许多Django REST? [英] How to update many to many Django REST?

查看:66
本文介绍了如何更新许多Django REST?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我将如何在Django REST框架中更新多对多关系?

How would I go about updating a many to many relationship in Django REST framework?

这是我的模型。

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

这是我的序列化器:

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

我如何实现更新主题?目前,我只能添加而不可以删除现有主题。

How do I achieve updating subjects? Currently, I can only add and not delete existing subjects.

推荐答案

这是一种解决方法。但我希望有人能发布更好的答案。这里的想法是先删除所有主题,然后再添加它们。但是,由于我们当然不能执行 teacher.subjects.all()。delete(),所以我们可以做到

Here is a workaround. I wish however someone would post a better answer. The idea here is to delete all subjects first then add them. However, since of course we cannot do teacher.subjects.all().delete(), we can do

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

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

这篇关于如何更新许多Django REST?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆