【发布时间】:2021-12-03 21:34:07
【问题描述】:
我正在尝试使用他们的 id 作为主键将一些学生添加到教师班,但我遇到了错误。
我有这样的教师和学生模型。
class Student(TimeStampAbstractModel):
user = models.OneToOneField(User, related_name="student", on_delete=models.CASCADE)
college_name = models.CharField(max_length=255, default="", blank=True)
address = models.CharField(max_length=255, default="", blank=True)
def __str__(self):
return self.user.name
class Teacher(TimeStampAbstractModel):
user = models.OneToOneField(User, related_name="teacher", on_delete=models.CASCADE)
address = models.CharField(max_length=255, default="", blank=True)
students_in_class = models.ManyToManyField(Student,related_name="teacher")
def __str__(self):
return self.user.name
这里的教师模型可以有许多学生在一个班级中使用他们的 id。我已经使用put api调用一键将学生添加到老师。
我的看法:
from rest_framework import status
class AddtoClassView(APIView):
def put(self,request,pk,*args,**kwargs):
id =pk
teacher = Teacher.objects.get(id=id)
serializer = TeacherSerializer(teacher,data=request.data)
if serializer.is_valid():
serializer.save()
print("iam if")
return Response({
"message":"Student has been added to class.",
"data": serializer.data
},status=status.HTTP_200_OK)
# else:
print("iam else")
return Response(serializer.data)
我的序列化器:
class TeacherSerializer(serializers.ModelSerializer):
students_in_class = serializers.PrimaryKeyRelatedField(
read_only= True
)
address = serializers.CharField(required=False)
# user = serializers.PrimaryKeyRelatedField(read_only=True)
class Meta:
model = Teacher
fields = ["address","students_in_class"]
# fields = '__all__'
def update(self, instance, validated_data):
instance.address = validated_data.get("address")
instance.save()
stu = validated_data.get("students_in_class")
print(stu)
if stu is not None:
print("iam stu")
instance.students_in_class.add(stu)
instance.save()
super(TeacherSerializer,self).update(instance, validated_data)
return instance
这里我使用了students_in_class 作为pk 字段(我仍然不明白什么时候使用integarfield 以及什么时候使用pk 字段)。我知道,因为我将 id 添加到 student_in_class 字段中,所以我不应该将其用作 read_only = true,但是我必须使用它,否则它会产生错误。如何解决这个问题?另外,我真的不知道在序列化程序类中定义哪些字段。
更新代码:
class TeacherSerializer(serializers.ModelSerializer):
# students_in_class = serializers.PrimaryKeyRelatedField(
# many = True, read_only= True
# )
students_in_class = serializers.ListField(
source="students_in_class.all",
child=serializers.PrimaryKeyRelatedField(queryset=Student.objects.all()),
)
address = serializers.CharField(required=False)
# user = serializers.PrimaryKeyRelatedField(read_only=True)
class Meta:
model = Teacher
fields = ["address","students_in_class"]
# fields = '__all__'
def update(self, instance, validated_data):
instance.address = validated_data['students_in_class']['all']
instance.save()
stu = validated_data.get("students_in_class")
print(stu)
if stu is not None:
print("iam stu")
instance.students_in_class.add(stu)
instance.save()
super(TeacherSerializer,self).update(instance, validated_data)
return instance
【问题讨论】:
-
请不要插入“EDIT”s/“UPDATE”s,只是让您的帖子成为编辑时最好的演示文稿。但是--请不要以使合理答案帖子无效的方式编辑问题帖子;如果有合理的答案,则修复旧帖子以提出问题并发布新问题。不要将答案编辑到问题帖子中,发布答案。 PS这篇文章没有说明这个“更新的代码”与你提出的问题有什么关系。 How to AskHelp center
标签: django api django-rest-framework primary-key django-serializer