如何将嵌套的序列化与Django Rest Mixins一起使用

发布于 2025-02-03 08:46:31 字数 4241 浏览 1 评论 0原文

我正在尝试在带有多个模型的Django-Rest框架中实现crud操作。 目标是在进行API调用时执行crud操作RON多表。

我使用mixins来自REST框架 https://www.django-rest-framework.org/api-guide/generic-views/#mixins

我找到了一些相关示例,但仍然,我的序列化机仅从student返回字段 crud操作的模型。我无法在REST API UI中看到课程模型字段。

问题 我无法从家庭作业课程模型中获得字段。

模型没有在django中创建新模型?

使用Django Rest框架中定义的Mixins类

models.py

class Student(models.Model):
    student_id = models.UUIDField(default=uuid.uuid4, unique=True,
                      primary_key=True, editable=False)
    firstName = models.CharField(max_length=20)
    age = models.IntegerField(default=18)

   

class Course(models.Model):
    student_id = models.ForeignKey(Student, on_delete=models.CASCADE)
    courseName = models.CharField(max_length=20)
    courseYear = models.IntegerField(default=2021)
    student = models.ManyToManyField(Student, related_name='courses')


class Homework(models.Model):
    student_id = models.ForeignKey(Student, on_delete=models.CASCADE)

    hwName = models.CharField(max_length=20)
    hwPossScore = models.IntegerField(default=100)
    course = models.ForeignKey(Course, related_name='homeworks', on_delete=models.CASCADE, null=True, blank=True)
    students = models.ManyToManyField(Student)

serializers.py

class StudentSerializer(serializers.ModelSerializer):
  
    class Meta:
        model = Student
        fields = "__all__"


class HomeworkSerializer(serializers.ModelSerializer):
   
    class Meta:
        model = Homework
        fields = __all__


class CourseSerializer(serializers.ModelSerializer):
   
    class Meta:
        model = Course
        fields = "__all__"
###I combine both Student and Course into one
class All_Serializer(serializers.ModelSerializer):
    
    students = serializers.SerializerMethodField()
    homeworks = serializers.SerializerMethodField()
    courses = serializers.SerializerMethodField()
    
    def get_students(self, obj):
        students = obj.student_set.all()
        serializer = StudentSerializer(students, many=True)
        return serializer.data

    def get_homeworks(self, obj):
        homeworks = obj.homework_set.all()
        serializer = HomeworkSerializer(homeworks, many=True, read_only=True)  
        return serializer.data

    def get_courses(self, obj):
        courses = obj.courses_set.all()
        serializer = CourseSerializer(courses, many=True, read_only=True)  
        return serializer.data

    class Meta:
        model = Student
        fields = ('student_id','firstName','age','homeworks','courses')
   

views.pys.py <

 class Main_mixins(generics.GenericAPIView, 
                                mixins.ListModelMixin, 
                                mixins.CreateModelMixin,
                                mixins.RetrieveModelMixin,
                                mixins.UpdateModelMixin,
                                mixins.DestroyModelMixin):
    serializer_class = All_Serializer
    queryset = Student.objects.all()
    lookup_field = 'student_id'

    def get(self, request, student_id=None):
        if student_id:
           return self.retrieve(request, student_id)
        else:
            return self.list(request)
    
    def post(self, request):
        return self.create(request)
    
    def perform_create(self, serializer):
        serializer.save()
    
    
    def put(self, request, student_id=None):
        return self.update(request, student_id=None, homeworks, courses)

/strong 感谢您的帮助!

I'm trying to implement CRUD operation in Django-REST framework with multiple models.
The goal is to perform CRUD operation ron multiple table when the API call is made.

I use mixins from REST framework https://www.django-rest-framework.org/api-guide/generic-views/#mixins

I have found some relevant examples but still, my serializer is only returning the fields from the Student model for CRUDoperation. I'm not able to see the Course models field in REst api ui.

PROBLEM
I can't get the fields from Homework and Course models.

How to display Data from two model without creating new model in Django?

use of mixins class defined in Django rest framework

models.py

class Student(models.Model):
    student_id = models.UUIDField(default=uuid.uuid4, unique=True,
                      primary_key=True, editable=False)
    firstName = models.CharField(max_length=20)
    age = models.IntegerField(default=18)

   

class Course(models.Model):
    student_id = models.ForeignKey(Student, on_delete=models.CASCADE)
    courseName = models.CharField(max_length=20)
    courseYear = models.IntegerField(default=2021)
    student = models.ManyToManyField(Student, related_name='courses')


class Homework(models.Model):
    student_id = models.ForeignKey(Student, on_delete=models.CASCADE)

    hwName = models.CharField(max_length=20)
    hwPossScore = models.IntegerField(default=100)
    course = models.ForeignKey(Course, related_name='homeworks', on_delete=models.CASCADE, null=True, blank=True)
    students = models.ManyToManyField(Student)

Serializers.py

class StudentSerializer(serializers.ModelSerializer):
  
    class Meta:
        model = Student
        fields = "__all__"


class HomeworkSerializer(serializers.ModelSerializer):
   
    class Meta:
        model = Homework
        fields = __all__


class CourseSerializer(serializers.ModelSerializer):
   
    class Meta:
        model = Course
        fields = "__all__"
###I combine both Student and Course into one
class All_Serializer(serializers.ModelSerializer):
    
    students = serializers.SerializerMethodField()
    homeworks = serializers.SerializerMethodField()
    courses = serializers.SerializerMethodField()
    
    def get_students(self, obj):
        students = obj.student_set.all()
        serializer = StudentSerializer(students, many=True)
        return serializer.data

    def get_homeworks(self, obj):
        homeworks = obj.homework_set.all()
        serializer = HomeworkSerializer(homeworks, many=True, read_only=True)  
        return serializer.data

    def get_courses(self, obj):
        courses = obj.courses_set.all()
        serializer = CourseSerializer(courses, many=True, read_only=True)  
        return serializer.data

    class Meta:
        model = Student
        fields = ('student_id','firstName','age','homeworks','courses')
   

views.py

 class Main_mixins(generics.GenericAPIView, 
                                mixins.ListModelMixin, 
                                mixins.CreateModelMixin,
                                mixins.RetrieveModelMixin,
                                mixins.UpdateModelMixin,
                                mixins.DestroyModelMixin):
    serializer_class = All_Serializer
    queryset = Student.objects.all()
    lookup_field = 'student_id'

    def get(self, request, student_id=None):
        if student_id:
           return self.retrieve(request, student_id)
        else:
            return self.list(request)
    
    def post(self, request):
        return self.create(request)
    
    def perform_create(self, serializer):
        serializer.save()
    
    
    def put(self, request, student_id=None):
        return self.update(request, student_id=None, homeworks, courses)

thanks for your help in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

风向决定发型 2025-02-10 08:46:31

不确定您要做什么。

课程作业的模型属于 一个 学生或拥有 Strong> 的学生?如果我错过了您实施的目的,请原谅我。

但是,如果您想要您的学生QuerySet包括课程和家庭作业领域。您可以尝试以下代码。

model.py

class Student(models.Model):
   student_id = models.UUIDField(default=uuid.uuid4, unique=True,
                     primary_key=True, editable=False)
   firstName = models.CharField(max_length=20)
   age = models.IntegerField(default=18)

   def get_course_set(self):
      return Course.objects.filter(student_id=self)

   def get_homework_set(self):
      return Homework.objects.filter(student_id=self)


class Course(models.Model):
    ...


class Homework(models.Model):
    ...
    

serializers.py

class HomeworkSerializer(serializers.ModelSerializer):
   
    class Meta:
        model = Homework
        fields = __all__


class CourseSerializer(serializers.ModelSerializer):
   
    class Meta:
        model = Course
        fields = "__all__"


class StudentSerializer(serializers.ModelSerializer):
    course = CourseSerializer(source="get_course_set", many=True, read_only=True)
    homework = HomeworkSerializer(source="get_homework_set", many=True, read_only=True)
  
    class Meta:
        model = Student
        fields = "__all__"

# Remove All_Serializer
# class All_Serializer(serializers.ModelSerializer):
      ...

views.py


class Main_mixins(generics.GenericAPIView, 
                                mixins.ListModelMixin, 
                                mixins.CreateModelMixin,
                                mixins.RetrieveModelMixin,
                                mixins.UpdateModelMixin,
                                mixins.DestroyModelMixin):

    # Change from All_Serializer to StudentSerializer
    serializer_class = StudentSerializer
    queryset = Student.objects.all()
    lookup_field = 'student_id'

    ...

Not really sure what you trying to do.

The model of course and homework belongs to one student or to have many of the student? Pardon me if I miss-understanding the purpose of your implementation.

But if you want your student queryset include a course and homework fields. You may try the code below.

models.py

class Student(models.Model):
   student_id = models.UUIDField(default=uuid.uuid4, unique=True,
                     primary_key=True, editable=False)
   firstName = models.CharField(max_length=20)
   age = models.IntegerField(default=18)

   def get_course_set(self):
      return Course.objects.filter(student_id=self)

   def get_homework_set(self):
      return Homework.objects.filter(student_id=self)


class Course(models.Model):
    ...


class Homework(models.Model):
    ...
    

serializers.py

class HomeworkSerializer(serializers.ModelSerializer):
   
    class Meta:
        model = Homework
        fields = __all__


class CourseSerializer(serializers.ModelSerializer):
   
    class Meta:
        model = Course
        fields = "__all__"


class StudentSerializer(serializers.ModelSerializer):
    course = CourseSerializer(source="get_course_set", many=True, read_only=True)
    homework = HomeworkSerializer(source="get_homework_set", many=True, read_only=True)
  
    class Meta:
        model = Student
        fields = "__all__"

# Remove All_Serializer
# class All_Serializer(serializers.ModelSerializer):
      ...

views.py


class Main_mixins(generics.GenericAPIView, 
                                mixins.ListModelMixin, 
                                mixins.CreateModelMixin,
                                mixins.RetrieveModelMixin,
                                mixins.UpdateModelMixin,
                                mixins.DestroyModelMixin):

    # Change from All_Serializer to StudentSerializer
    serializer_class = StudentSerializer
    queryset = Student.objects.all()
    lookup_field = 'student_id'

    ...
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文