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