I'm stumled upon a case I don't understand.
I have two related models:
class Course(models.Model):
  code = models.CharField(max_length=10, default='')
  semester = models.CharField(max_length=10, default='')
  class Meta:
        unique_together = [['code', 'semester']]
and:
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)
In the StudentWorkSerializer I'd like to expand a course field  into [code, semester]:
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']
This works nicely for GET, e.g. I receive this:
{'code': 'HW1', 'course': {'code': 'T101', 'semester': 'S20'}, 'deadline': '2020-09-04T23:59:00+03:00'}
but this does not work for POST:
POST /studentworks json=dict(code='HW2', course={"code": "T101", "semester": "S20"}, deadline="2020-09-04T23:59")
says in the stacktrace:
django.db.utils.IntegrityError: NOT NULL constraint failed: botdb_studentwork.course_id
So this looks to me that {"code": "T101", "semester": "S20"} does not de-serialize into Course object and it's id is not passed to StudentWork's create?
What should I do?
Thanks in advance!
UPDATE: I was asked if read_only=True on the related field serializer is intentional?
If I don't set it, I get:
'{"course":{"non_field_errors":["The fields code, semester must make a unique set."]}}'
which makes me thinking that it wants to create a new Course for me (Since code and semester are declared unique_together) at the time I want to create a StudentWork. Which I don't want.
If I than change, say, semester to S21 in the POST data, I get:
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.
So hence my confusion - I can't figure out how to prevent it from attempting to create a new Course, and just use an existing in a related field.