DJANGO:如何编写一个从相关模型添加字段的自定义序列化程序?
DJANGO: How to write a custom serializer that add a field from a related model?
型号:
class Subject(models.Model):
db = 'default'
subjectName = models.CharField(max_length = 100)
cohortID = models.ForeignKey(Cohort, on_delete=models.CASCADE, related_name='subjects')
teacherID = models.ForeignKey(Teacher, on_delete=models.CASCADE, related_name='subjects', null=True)
class Cohort(models.Model):
db = 'default'
school_creator = models.ForeignKey(CustomUser, on_delete = models.CASCADE, related_name='cohorts')
mainTeacherID = models.ForeignKey(CustomUser, on_delete=models.CASCADE, null=True, related_name='mainCohorts')
class_name = models.CharField(max_length = 100)
序列化器:
class SubjectSerializer(serializers.ModelSerializer):
class Meta:
model = models.Subject
fields = ('subjectName', 'teacherID', 'pk',)
这是使用上面的序列化程序的响应:
{"subjectName":"Maths","teacherID":2,"pk":4}
我想要:
{"subjectName":"Maths","teacherID":2,"pk":4, "cohortName" : "4 B"}
队列名称应取自模型 Cohort.class_name。
我想这样做是可能的,因为 Subject 通过 ForeignKey Subject.cohortID 连接到 Cohort。
我尝试添加一些自定义序列化程序:
class SubjectCohortSerializer(serializers.ModelSerializer):
cohortName = serializers.SerializerMethodField(read_only=True)
class Meta:
model = models.Subject
fields = ('subjectName', 'teacherID', 'pk','cohortName')
def get_cohortName(self, subject):
return models.Cohort.objects.get(pk=self.context['request'].cohortID.className)
但我确实做错了什么,很难理解上面的序列化程序中发生了什么。
将您的 get_cohortName()
方法更改为,
class SubjectCohortSerializer(serializers.ModelSerializer):
cohortName = serializers.SerializerMethodField(read_only=True)
class Meta:
model = models.Subject
fields = ('subjectName', 'teacherID', 'pk', 'cohortName')
def get_cohortName(self, subject):
return subject.cohortID.className
型号:
class Subject(models.Model):
db = 'default'
subjectName = models.CharField(max_length = 100)
cohortID = models.ForeignKey(Cohort, on_delete=models.CASCADE, related_name='subjects')
teacherID = models.ForeignKey(Teacher, on_delete=models.CASCADE, related_name='subjects', null=True)
class Cohort(models.Model):
db = 'default'
school_creator = models.ForeignKey(CustomUser, on_delete = models.CASCADE, related_name='cohorts')
mainTeacherID = models.ForeignKey(CustomUser, on_delete=models.CASCADE, null=True, related_name='mainCohorts')
class_name = models.CharField(max_length = 100)
序列化器:
class SubjectSerializer(serializers.ModelSerializer):
class Meta:
model = models.Subject
fields = ('subjectName', 'teacherID', 'pk',)
这是使用上面的序列化程序的响应:
{"subjectName":"Maths","teacherID":2,"pk":4}
我想要:
{"subjectName":"Maths","teacherID":2,"pk":4, "cohortName" : "4 B"}
队列名称应取自模型 Cohort.class_name。 我想这样做是可能的,因为 Subject 通过 ForeignKey Subject.cohortID 连接到 Cohort。 我尝试添加一些自定义序列化程序:
class SubjectCohortSerializer(serializers.ModelSerializer):
cohortName = serializers.SerializerMethodField(read_only=True)
class Meta:
model = models.Subject
fields = ('subjectName', 'teacherID', 'pk','cohortName')
def get_cohortName(self, subject):
return models.Cohort.objects.get(pk=self.context['request'].cohortID.className)
但我确实做错了什么,很难理解上面的序列化程序中发生了什么。
将您的 get_cohortName()
方法更改为,
class SubjectCohortSerializer(serializers.ModelSerializer):
cohortName = serializers.SerializerMethodField(read_only=True)
class Meta:
model = models.Subject
fields = ('subjectName', 'teacherID', 'pk', 'cohortName')
def get_cohortName(self, subject):
return subject.cohortID.className