python - Django REST 框架——Many2Many/Through

标签 python django serialization django-models django-rest-framework

总的来说,我对以下模型的序列化器感到困惑。有人愿意查看这段代码并看看它是否有意义/是否需要更改某些内容才能使我的序列化器正常工作? 我相信它在很大程度上是正确的,但我不确定如何处理 Term 中的 ManyToMany 关系以及“through=Offering”。

这是 models.py:

from django.db import models
from django.contrib.auth.models import User

class Course(models.Model):
    prefix = models.CharField(max_length=100)
    course_num = models.CharField(max_length=100)
    lecture_hours = models.CharField(max_length=20)
    lab_hours = models.CharField(max_length=20)
    credit_hours = models.CharField(max_length=20)
    date = models.DateField(auto_now=False, auto_now_add=False)
    previous_version = models.ForeignKey('self', on_delete=models.DO_NOTHING, blank=True, null=True)

    class Meta:
        ordering = ('prefix')

class Term(models.Model):
    semester = models.CharField(max_length=100)
    year = models.CharField(max_length=100)
    name = models.CharField(max_length=200)
    courses = models.ManyToManyField(Course, through='Offering', related_name='terms')

    def termCourses(self):
        term_courses = self.courses.all()
        return term_courses

class Offering(models.Model):
    term = models.ForeignKey(Term, on_delete = models.CASCADE)
    course = models.ForeignKey(Course, on_delete = models.CASCADE)
    instructor = models.ForeignKey(User, on_delete = models.CASCADE)

class TermPermission(models.Model):
    creator = models.ForeignKey(User, on_delete = models.CASCADE)
    term = models.ForeignKey(Term, on_delete = models.CASCADE)

这是序列化器.py

from django.contrib.auth.models import User, Group
from .models import Course, Term, Offering
from rest_framework import serializers


class CourseSerializer(serializers.ModelSerializer)
    class Meta:
        model = Course
        fields = ('prefix,',
                  'course_num',
                  'lecture_hours',
                  'lab_hours',
                  'credit_hours',
                  'date',
                  'previous_version',
                  'terms'
                  )

class TermSerializer(serializers.ModelSerializer)
    courses = OfferingSerializer(source='offering_set', many=True)

    class Meta:
        model = Term
        fields = ('semester,',
                 'year',
                  'name',
                  'courses',
                  )

class OfferingSerializer(serializers.ModelSerializer)
    offering_term = serializers.ReadOnlyField(source='term.id')
    offering_course = serializers.ReadOnlyField(source='course.id')

class Meta:
    model = Offering
    fields = ('offering_term',
              'offering_course'
              )

最佳答案

如果 API 用于列出所列产品的条款,则这应该有效:

from django.contrib.auth.models import User, Group
from .models import Course, Term, Offering
from rest_framework import serializers

class CourseSerializer(serializers.ModelSerializer):

    class Meta:
        model = Course
        fields = ('prefix,',
                  'course_num',
                  'lecture_hours',
                  'lab_hours',
                  'credit_hours',
                  'date',
                  'previous_version',
                  )

class OfferingSerializer(serializers.ModelSerializer):
    course = CourseSerializer(read_only=True)

    class Meta:
        model = Offering
        fields = ('course', "instructor")


class TermSerializer(serializers.ModelSerializer):
    offerings = OfferingSerializer(source="offering_set")

    class Meta:
        model = Term
        fields = ('semester,', 'year', 'name', 'offerings')

这将导致以下结果:

{
    "count": 1,
    "next": null,
    "previous": null,
    "results": [
        {
            "name": "Winter of 1993",
            "year": "1993",
            "semester": "Winter",
            "offerings": [
                {
                    "instructor": "<instructor_id>",
                    "course": {
                        "id": 1,
                        "prefix": "CS",
                        "credit_hours": "4.0",
                        "lab_hours": "2"
                    }
                },
                {
                    "instructor": "<instructor_id>",
                    "course": {
                        "id": 2,
                        "prefix": "ECON",
                        "credit_hours": "4.0",
                        "lab_hours": "0"
                    }
                },
            ]
        }
    ]
}

关于python - Django REST 框架——Many2Many/Through,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53753273/

相关文章:

python - Django admin - 在用户模型上创建复杂的过滤器

django - 从 django 中的页面添加 Facebook 登录和数据收集(Social Auth)

c# - protobuf-net 中的 prepareserializer 有什么作用?

python - 如何使用 Django 比较要使用 Markdown 渲染的两个模型?

c# - 如何序列化包含其他类对象的类(递归序列化?)

用于通信的 C++ 对象到 XML

python - 在 Windows 10 上使用 python 3 运行 cassandra cqlsh

Python:强制虚拟环境使用 Windows 上的系统证书存储

python - 如果行不满足使用 pandas 的条件,如何删除行

python - Django 错误 : 'unicode' object is not callable