如何将数据添加到 Django DRF 中的多对多字段

How to add data to Many-To-Many field in Django DRF

我是 Django DRF 的新手,正在尝试完成一个体校项目。我有一个教练、classes 和学生的模型。这是一个简化的版本,以保持简单和容易:

class Student (models.Model):
    first_name = models.CharField(max_length = 50)
    last_name = models.CharField(max_length = 50)

    def __str__(self):
        return f'{self.first_name} {self.last_name}'

 class Coach (models.Model):
    first_name = models.CharField(max_length = 50)
    last_name = models.CharField(max_length = 50)

    def __str__(self):
        return f'{self.first_name} {self.last_name}'

 class ClassDetails (models.Model):
    class_name = models.CharField(max_length = 50)
    class_coach = models.ForeignKey(Coach, related_name='coach_classes')
    class_members = models.ManyToMany(Student, related_name='student_classes')

    def __str__(self):
        return self.class_name

为了 list/add 学生到 class,我正在使用以下序列化程序:

class ClassDetailsSerializer(serializers.ModelSerializer):
class Meta:
    model = ClassDetails
    fields = ['id','class_name', 'class_coach', 'class_members]
    read_only_fields = ('id', 'class_name', 'class_coach')

获取数据工作正常。另外,添加教练工作正常,真正让我感到困难的是添加 class 成员。我正在使用以下视图:

def member_add(self, request):
    my_class = ClassDetails.objects.get(pk = request.data['id']
    serializer = ClassDetailsSerializer(my_class, data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response('Member added', status.HTTP_201_CREATED)
    return Response(serializer.errors, status.HTTP_406_NOT_ACCEPTABLE)

我正在发送 POST 正文,例如:

{
    "id": 2, <- class id
    "class_members": [20] <- student's id to add to the class members
}

问题是无论 class 中有多少学生,上面的代码都会将他们全部删除并用学生 ID 20 代替。

谢谢!

我会说用不同的方式定义你的模型,这里是一个例子 -

首先定义您的 Class 详细信息,例如 -

 class ClassDetails (models.Model):
    class_name = models.CharField(max_length = 50)

    def __str__(self):
        return self.class_name

然后定义你的 Student 例如 -

class Student (models.Model):
    first_name = models.CharField(max_length = 50)
    last_name = models.CharField(max_length = 50)
    classDetail = models.ForeignKey(ClassDetails)

    def __str__(self):
        return f'{self.first_name} {self.last_name}'

最后你的教练是 -

class Coach (models.Model):
    first_name = models.CharField(max_length = 50)
    last_name = models.CharField(max_length = 50)
    classDetail = models.ForeignKey(ClassDetails)
    
    def __str__(self):
        return f'{self.first_name} {self.last_name}'

通过这种方式,您可以使用嵌套功能 - 现在您的学生始终链接到 class,您的教练也链接到您的 class。

现在你可以说每个 class 可以有多个学生,每个 class 可以有多个教练。现在,如果 Coach 根据 class 是唯一的,您可以将 Coach Modals 写为 -

class Coach (models.Model):
    first_name = models.CharField(max_length = 50)
    last_name = models.CharField(max_length = 50)
    classDetail = models.OneToOneField(ClassDetails)

根据输入编辑我的答案 --

在manytomany类型字段中添加一个新的id 首先,您必须为例如

创建一个学生
s = Student.objects.create()

然后做类似

的事情
my_class = ClassDetails.objects.get(pk = request.data['id'])

获取 classdetail 的正确实例,然后执行类似 -

的操作
my_class.class_members.add(s)

将新学生添加到 Class详细信息

中的 manytomany 字段

您可以根据自己的需要进行定制,希望对您有所帮助。