Python 如何实现django框架嵌套关系?
我已经尝试了django rest framework文档中所示的选项,但仍然无法正常工作。在实现嵌套关系时,我只获得课程的主键,我希望所有课程都能显示出来。这意味着一个学生有很多课程,我希望允许每个学生都显示自己的课程。 非常感谢。 我的代码: Models.pyPython 如何实现django框架嵌套关系?,python,django,django-rest-framework,django-serializer,Python,Django,Django Rest Framework,Django Serializer,我已经尝试了django rest framework文档中所示的选项,但仍然无法正常工作。在实现嵌套关系时,我只获得课程的主键,我希望所有课程都能显示出来。这意味着一个学生有很多课程,我希望允许每个学生都显示自己的课程。 非常感谢。 我的代码: Models.py from django.db import models from django.contrib.auth.models import User # from django.utils import timezone from da
from django.db import models
from django.contrib.auth.models import User
# from django.utils import timezone
from datetime import date
class Student(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
information = models.TextField(blank=True)
objects = models.Manager() # default manager
class Meta:
ordering = ('-first_name',)
def __str__(self):
return self.first_name
class Lesson(models.Model):
options = (
('paid', 'Paid'),
('not paid', 'Not Paid'),
)
student = models.ForeignKey(
Student, on_delete=models.CASCADE, related_name='lessons')
paid = models.CharField(
max_length=10, choices=options, default='not paid')
title = models.CharField(max_length=50)
task1 = models.CharField(max_length=50)
description1 = models.TextField(blank=True)
task2 = models.CharField(max_length=50)
description2 = models.TextField(blank=True)
user = models.ForeignKey(
User, null=True, on_delete=models.CASCADE)
lesson_date = models.DateField(default=date.today, null=False)
objects = models.Manager() # default manager
class Meta:
ordering = ('-lesson_date',)
def __str__(self):
return '%s: %s %s %s' % (self.student, self.title, self.lesson_date, self.paid)
序列化程序.py
from rest_framework import serializers, fields
from private_models.models import Lesson, Student
class LessonSerializer(serializers.ModelSerializer):
#student = serializers.SerializerMethodField()
class Meta:
model = Lesson
fields = ('id', 'student', 'title', 'lesson_date', 'paid',)
# def get_student(self, obj):
# return obj.student.first_name
class LessonDetailSerializer(serializers.ModelSerializer):
class Meta:
model = Lesson
fields = ('id', 'student', 'title', 'task1', 'description1',
'task2', 'description2', 'lesson_date', 'paid',)
class StudentDetailSerializer(serializers.ModelSerializer):
class Meta:
model = Student
fields = ('first_name', 'last_name', 'information',)
class StuSerializer(serializers.ModelSerializer):
class Meta:
model = Student
lessons = LessonSerializer(many=True, read_only=True)
fields = ('first_name', 'last_name', 'information', 'lessons')
Views.py
from rest_framework import generics
from private_models.models import Lesson, Student
from .serializers import LessonSerializer, LessonDetailSerializer, StudentDetailSerializer, StuSerializer
# Create your views here.
class LessonList(generics.ListCreateAPIView):
queryset = Lesson.objects.all()
serializer_class = LessonSerializer
class StuDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Student.objects.all()
serializer_class = StudentDetailSerializer
class StuList(generics.ListCreateAPIView):
queryset = Student.objects.all()
serializer_class = StuSerializer
class LessonDetail(generics.RetrieveDestroyAPIView):
queryset = Lesson.objects.all()
serializer_class = LessonDetailSerializer
url.py
from django.urls import path
from .views import LessonList, StuDetail, LessonDetail, StuList
app_name = 'private_api'
urlpatterns = [
path('<int:pk>/', LessonDetail.as_view(), name='detailcreate'),
path('', LessonList.as_view(), name='listcreate'),
path('students/<int:pk>/', StuDetail.as_view(), name='sdetailcreate'),
path('students/', StuList.as_view(), name='slistcreate'),
]
输出-只有课程的代码,没有课程的细节
GET /api/students/
HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
[
{
"first_name": "Tim",
"last_name": "ff",
"information": "ff",
"lessons": [
14
]
},
{
"first_name": "Lory",
"last_name": "AAf",
"information": "ff",
"lessons": []
}
]
HTML form
Raw data
First name
Last name
Information
LessonsTim: sf 2021-05-26 not paid
您需要这样做:
class StuSerializer(serializers.ModelSerializer):
lessons = LessonDetailSerializer(many=True) #add this so the lesson objects get serialized
class Meta:
model = Student
lessons = LessonSerializer(many=True, read_only=True)
fields = ('first_name', 'last_name', 'information', 'lessons')
好啊成功了!!非常感谢你,保罗!
class StuSerializer(serializers.ModelSerializer):
lessons = LessonDetailSerializer(many=True) #add this so the lesson objects get serialized
class Meta:
model = Student
lessons = LessonSerializer(many=True, read_only=True)
fields = ('first_name', 'last_name', 'information', 'lessons')