总的来说,我对以下模型的序列化器感到困惑。有人愿意查看这段代码并看看它是否有意义/是否需要更改某些内容才能使我的序列化器正常工作?
我相信它在很大程度上是正确的,但我不确定如何处理 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/