Django REST 框架 JSON 数组 GET



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

我希望能够以特定格式获取JSON,如目标嵌套JSON数组所示。

现在,我能够检索一个 JSON 数组,如我当前的 JSON 数组所示。我已经检查了这个问题,似乎我们有目标,但我无法成功。

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

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')
您可以使用

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
    )
    ...

讲座.领域

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"
    },

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

#/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的答案,我知道它看起来很脏,但我现在正在改变项目。

最新更新