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



我是Django DRF的新手,正在尝试完成一个体育学校项目。我有一个教练、班级和学生的模型。这里有一个精简版,以保持简单易用:

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

为了列出/添加学生到类中,我使用了以下序列化程序:

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

获取数据还可以。此外,添加教练也很好,真正让我感到困难的是添加一名班级成员。我使用以下视图:

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
}

问题是,无论班上有多少学生,上面的内容都会将他们全部删除,并将学生id改为20。

  • 如何保留当前学生,并且只向他们添加新id
  • 如何在不删除class_members字段中的全部数据的情况下删除学生的id

谢谢!

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

首先定义你的类详细信息,如-

class ClassDetails (models.Model):
class_name = models.CharField(max_length = 50)
def __str__(self):
return self.class_name

然后将你的学生定义为-

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

通过这种方式,你可以使用嵌套功能-现在你的学生总是链接到一个班级,你的教练也链接到你的班级。

现在你可以说,每个班级可以有多个学生,每个班级也可以有多名教练。现在,如果Coach是每个类唯一的,您可以将Coach Modals写成-

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

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

在manytomy类型字段中添加新id首先你必须为创建一个学生

s = Student.objects.create()

然后做一些类似的事情

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

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

my_class.class_members.add(s)

在ClassDetails 中为您的多人字段添加一名新学生

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

相关内容

  • 没有找到相关文章

最新更新