Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何实现django框架嵌套关系?_Python_Django_Django Rest Framework_Django Serializer - Fatal编程技术网

Python 如何实现django框架嵌套关系?

Python 如何实现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

我已经尝试了django rest framework文档中所示的选项,但仍然无法正常工作。在实现嵌套关系时,我只获得课程的主键,我希望所有课程都能显示出来。这意味着一个学生有很多课程,我希望允许每个学生都显示自己的课程。 非常感谢。 我的代码:

Models.py

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