如何将数据添加到 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 代替。
- 如何保留当前学生并只将新 ID 添加给他们?
- 如何在不删除 class_members 字段中的全部数据的情况下删除学生的 ID?
谢谢!
我会说用不同的方式定义你的模型,这里是一个例子 -
首先定义您的 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 字段
您可以根据自己的需要进行定制,希望对您有所帮助。
我是 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 代替。
- 如何保留当前学生并只将新 ID 添加给他们?
- 如何在不删除 class_members 字段中的全部数据的情况下删除学生的 ID?
谢谢!
我会说用不同的方式定义你的模型,这里是一个例子 -
首先定义您的 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 字段您可以根据自己的需要进行定制,希望对您有所帮助。