我是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 中为您的多人字段添加一名新学生
你可以根据自己的需要进行定制,希望这对你有所帮助。