【问题标题】:How I can flatten many to many relationship using Django serializer我如何使用 Django 序列化程序来扁平化多对多关系
【发布时间】:2021-07-19 21:49:57
【问题描述】:

我是 Django 新手。当我尝试为多对多关系实现序列化程序时,我遇到了问题。我想序列化多对多字段并且需要基于嵌套对象创建一个字典。

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

序列化器.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

我得到了这样的回应:

{
results: [
{
"class_room": "Class 1",
"teacher": [
  {
    "teacher_name": "Maria"
  },
  {
    "teacher_name": "sara"
  }
],
"student_name": "John"
}
]
}

但我期待结果:

{
results: [
  {
    "class_room": "Class 1",
    "teacher_name": "Maria",
    "student_name": "John"
  },
  {
    "class_room": "Class 1",
    "teacher_name": "sara",
    "student_name": "John"
  },
  ]
  }

请帮助我实现这一目标。 提前致谢

【问题讨论】:

    标签: django django-models django-rest-framework django-views django-serializer


    【解决方案1】:

    你应该在 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)
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      • 2019-07-29
      • 1970-01-01
      • 2015-12-04
      • 2016-11-24
      • 1970-01-01
      • 2017-02-13
      相关资源
      最近更新 更多