Django DRF(反)序列化程序不适合我?

2024-09-29 19:08:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我被一个我不明白的案子缠住了

我有两个相关的模型:

class Course(models.Model):
  code = models.CharField(max_length=10, default='')
  semester = models.CharField(max_length=10, default='')

  class Meta:
        unique_together = [['code', 'semester']]

以及:

class StudentWork(models.Model):
  code = models.CharField(max_length=10, default='')
  course = models.ForeignKey(Course,on_delete=models.CASCADE, related_name='student_works')
  deadline = models.DateTimeField(blank=True)

在StudentWorksSerializer中,我想将course字段扩展为[code,Serm]:

class CourseNaturalSerializer(serializers.ModelSerializer):
    class Meta:
        model = Course
        fields = ['code', 'semester']

class StudentWorkWithCourseSerializer(serializers.ModelSerializer):
    course = CourseNaturalSerializer(read_only=True)
    
    class Meta:
       model = StudentWork
       fields = ['code', 'course', 'deadline']

这对GET非常有效,例如,我收到了:

{'code': 'HW1', 'course': {'code': 'T101', 'semester': 'S20'}, 'deadline': '2020-09-04T23:59:00+03:00'}

但这不适用于邮政:

POST /studentworks json=dict(code='HW2', course={"code": "T101", "semester": "S20"}, deadline="2020-09-04T23:59")

在stacktrace中显示:

django.db.utils.IntegrityError: NOT NULL constraint failed: botdb_studentwork.course_id

在我看来,{“代码”:“T101”,“学期”:“S20”}没有反序列化到课程对象中,它的id也没有传递给StudentWork的create

我该怎么办

提前谢谢

更新: 有人问我相关字段序列化程序上的read_only=True是否是故意的

如果我不设置它,我会得到:

'{"course":{"non_field_errors":["The fields code, semester must make a unique set."]}}'

这让我想到,在我创建学生作业时,它想为我创建一门新课程(因为代码和学期一起被声明为唯一的)。这是我不想要的

如果我在POST数据中将学期改为S21,我会得到:

AssertionError: The `.create()` method does not support writable nested fields by default.
Write an explicit `.create()` method for serializer `botdb.serializers.StudentWorkWithCourseSerializer`, or set `read_only=True` on nested serializer fields.

因此,我感到困惑——我不知道如何阻止它尝试创建一门新课程,而只是使用相关领域中的现有课程


Tags: truedefaultfieldsmodelscodelengthmaxmeta

热门问题