我如何使用 Django 序列化程序展平多对多关系
How I can flatten many to many relationship using Django serializer
我是 Django 的新手。当我尝试为多对多关系实现序列化程序时,我得到 problem.I 想要序列化多对多字段并需要基于嵌套对象创建字典。
models.py
class ClassRoom(models.Model):
name = models.CharField(max_length=10)
def __str__(self):
return self.name
class Teacher(models.Model):
name = models.CharField(max_length=50)
def __str__(self):
return self.name
class Student(models.Model):
name = models.CharField(max_length=50)
class_room = models.ForeignKey(ClassRoom, on_delete=models.CASCADE)
teacher = models.ManyToManyField(Teacher)
def __str__(self):
return self.name
serializers.py
class ClassRoomSerializer(serializers.Serializer):
class Meta:
model = ClassRoom
fields = '__all__'
class TeacherSerializer(serializers.Serializer):
teacher_name = serializers.CharField(source="name", label="Teacher")
class Meta:
model = Teacher
fields = ['name']
class StudentSerializer(serializers.Serializer):
class_room = serializers.CharField(source="class_room.name")
teacher = TeacherSerializer(many=True)
student_name = serializers.CharField(source='name', label="Student")
class Meta:
model = Student
fields = ['student_name', 'teacher', 'class_room']
views.py
class HomeclassView(viewsets.ModelViewSet):
queryset = Student.objects.all()
serializer_class = StudentSerializer
I got the response like this:
{
results: [
{
"class_room": "Class 1",
"teacher": [
{
"teacher_name": "Maria"
},
{
"teacher_name": "sara"
}
],
"student_name": "John"
}
]
}
But I am expecting the result in :
{
results: [
{
"class_room": "Class 1",
"teacher_name": "Maria",
"student_name": "John"
},
{
"class_room": "Class 1",
"teacher_name": "sara",
"student_name": "John"
},
]
}
请帮我实现这个。
提前致谢
你应该为 ModelViewSet 中的教师:
class HomeclassView(viewsets.ModelViewSet):
queryset = Student.objects.all()
serializer_class = StudentSerializer
def list(self, request, *args, **kwargs):
response = super().list(request, *args, **kwargs)
flat_response = []
for teacher in response['teacher']:
res = response.copy()
del res['teacher']
res['teacher_name'] = teacher['teacher_name']
flat_response.append(res)
return Response(data=flat_response)
我是 Django 的新手。当我尝试为多对多关系实现序列化程序时,我得到 problem.I 想要序列化多对多字段并需要基于嵌套对象创建字典。
models.py
class ClassRoom(models.Model):
name = models.CharField(max_length=10)
def __str__(self):
return self.name
class Teacher(models.Model):
name = models.CharField(max_length=50)
def __str__(self):
return self.name
class Student(models.Model):
name = models.CharField(max_length=50)
class_room = models.ForeignKey(ClassRoom, on_delete=models.CASCADE)
teacher = models.ManyToManyField(Teacher)
def __str__(self):
return self.name
serializers.py
class ClassRoomSerializer(serializers.Serializer):
class Meta:
model = ClassRoom
fields = '__all__'
class TeacherSerializer(serializers.Serializer):
teacher_name = serializers.CharField(source="name", label="Teacher")
class Meta:
model = Teacher
fields = ['name']
class StudentSerializer(serializers.Serializer):
class_room = serializers.CharField(source="class_room.name")
teacher = TeacherSerializer(many=True)
student_name = serializers.CharField(source='name', label="Student")
class Meta:
model = Student
fields = ['student_name', 'teacher', 'class_room']
views.py
class HomeclassView(viewsets.ModelViewSet):
queryset = Student.objects.all()
serializer_class = StudentSerializer
I got the response like this:
{
results: [
{
"class_room": "Class 1",
"teacher": [
{
"teacher_name": "Maria"
},
{
"teacher_name": "sara"
}
],
"student_name": "John"
}
]
}
But I am expecting the result in :
{
results: [
{
"class_room": "Class 1",
"teacher_name": "Maria",
"student_name": "John"
},
{
"class_room": "Class 1",
"teacher_name": "sara",
"student_name": "John"
},
]
}
请帮我实现这个。 提前致谢
你应该为 ModelViewSet 中的教师:
class HomeclassView(viewsets.ModelViewSet):
queryset = Student.objects.all()
serializer_class = StudentSerializer
def list(self, request, *args, **kwargs):
response = super().list(request, *args, **kwargs)
flat_response = []
for teacher in response['teacher']:
res = response.copy()
del res['teacher']
res['teacher_name'] = teacher['teacher_name']
flat_response.append(res)
return Response(data=flat_response)