【问题标题】:Django REST framework JSON array GETDjango REST 框架 JSON 数组 GET
【发布时间】:2018-09-16 07:25:09
【问题描述】:

我正在运行 Django 2.0 和 DRF (Django REST Framework) 3.8.0。

我希望能够以特定格式获取 JSON,如 GOAL NESTED JSON ARRAY 中所示。

现在,我可以检索一个 JSON 数组,如 MY CURRENT JSON ARRAY 中所示。我已经检查了这个 question,似乎我们有目标,但我无法成功。

下面有我的模型、视图和序列化程序。 这是通过使用这个来实现的:

GET /studentlectures/1/get_studlect/ 其中 1 是 {pk}

当前 JSON 数组:

[
{
    "id": 1,
    "lecture": 1,
    "student": 1
},
{
    "id": 19,
    "lecture": 4,
    "student": 1
}
]

目标嵌套 JSON 数组

{
        "id": 1,
        "student_code": "60637-009",
        "first_name": "Zoltan",
        "last_name": "Drogo",
        "lectures": [
            {
                "lecture_id": 1,
                "subject_name": "English",
                "teacher_id": 1,
                "teacher_name": "Cirillo Kierans",
                "room": "Room A",
                "schedule": "08:00 AM - 10:00 AM"
            },
            {
                "lecture_id": 2,
                "subject_name": "Math",
                "teacher_id": 3,
                "teacher_name": "Johanna Probate",
                "room": "Room C",
                "schedule": "08:00 AM - 10:00 AM"
            },
            . . . . . . 
}

型号:

class Studentlecture(models.Model):
    student = models.ForeignKey(Student, default='')
    lecture = models.ForeignKey(Lecture, default='')
    studentlecture_name = models.CharField(max_length=20, default='ComputerScience Lectures')

    def __str__(self):
        return f'{self.studentlecture_name}'

查看:

class StudentlectureViewSet(ModelViewSet):
    """
    API endpoint that allows groups to be viewed or edited.
    """
    serializer_class = StudentlectureSerializer
    queryset = Studentlecture.objects.all()
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

    #/studentlectures/{pk}/get_studlect/ gives the lectures of student pk
    @action(detail=True)
    def get_studlect(self, request, *args, **kwargs):
        student_lectures = Studentlecture.objects.all().filter(student_id=self.kwargs['pk'])
        serializer = self.get_serializer(student_lectures, many=True)
        return Response(serializer.data)

    #/studentlectures/{pk}/get_lectstud/ gives the students of lecture pk
    @action(detail=True)
    def get_lectstud(self, request, *args, **kwargs):
        lecture_students = Studentlecture.objects.all().filter(lecture_id=self.kwargs['pk'])
        serializer = self.get_serializer(lecture_students, many=True)
        print(serializer)
        return Response(serializer.data)

序列化器:

class StudentlectureSerializer(serializers.ModelSerializer):
    class Meta:
        model = Studentlecture
        fields = ('url', 'id', 'lecture', 'student')

【问题讨论】:

    标签: python json django api django-rest-framework


    【解决方案1】:

    无法立即回来查看,但这是我所做的:

    #/studentlectures/{pk}/get_studlect/ gives the lectures of student pk
    @action(detail=True)
    def get_studlect(self, request, *args, **kwargs):
        student_lectures = Studentlecture.objects.all().filter(student_id=self.kwargs['pk'])
        serializer = self.get_serializer(student_lectures, many=True)
    
        student = Student.objects.filter(id=self.kwargs['pk'])
        lecture_nest = serializer.data        
    
        data = {
          "id": student.values()[0]['id'],
          "student_code": student.values()[0]['student_code'],
          "first_name": student.values()[0]['first_name'],
          "last_name": student.values()[0]['last_name'],
          "lectures": lecture_nest
        }
    
        return Response(data)
    

    我稍微调整了 Madi7 的答案,我知道它看起来很脏,但我现在正在更改项目。

    【讨论】:

      【解决方案2】:

      您可以为此使用RelatedField

      序列化器

      from rest_framework.serializers import ModelSerializer, IntegerField
      
      from lectures.fields import LectureRelatedField
      
      class StudentLectureSerializer(ModelSerializer):
          id = IntegerField(read_only=True)
          lecture = LectureRelatedField(
              queryset=Lecture.objects.all(), required=True
          )
          ...
      

      lectures.fields

      from rest_framework.serializers import RelatedField
      
      class LectureRelatedField(RelatedField):
          def to_representation(self, obj):
              data = {
                  'lecture_id': obj.lecture_id,
                  'subject_name': obj.subject_name,
                  'teacher_id': obj.teacher_id,
                  'teacher_name': obj.teacher_name,
                  'room': obj.room,
                  'schedule': obj.schedule
              }
              return data
      
          def to_internal_value(self, pk):
              return Lecture.objects.get(id=pk)
      

      因此,您在发出请求时会收到这样的json

      "lectures": [
          {
              "lecture_id": 1,
              "subject_name": "English",
              "teacher_id": 1,
              "teacher_name": "Cirillo Kierans",
              "room": "Room A",
              "schedule": "08:00 AM - 10:00 AM"
          },
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-15
        • 1970-01-01
        • 2015-09-13
        • 1970-01-01
        • 2019-02-09
        • 2017-03-19
        • 1970-01-01
        • 2014-02-17
        相关资源
        最近更新 更多