Django.db.utils.IntegrityError: (1048, "Column cannot be null") при использовании вложенного сериализатора

у меня возникла проблема при попытке serializer.save().

django.db.utils.IntegrityError: (1048, "Column 'person_id' cannot be null")

я хочу создать запрос POST и PUT, но получаю сообщение выше. Это происходит, когда я добавляю вложенный сериализатор в trainee serializer.

person и fav_sport поля не могут быть null = true blank = true

это происходит либо когда depth = 1

Надеюсь, вы сможете мне помочь, почему так происходит.

вот json, который я отправляю:

{
    "person":15,
    "sport_type":[1,2]

}

я делаю вложенный сериализатор, потому что хочу, чтобы api возвращало это в GET и POST и PUT повторные наборы:

 {
        "person": {
            "id": 15,
            "first_name": "liad3",
            "last_name": "hazoot3",
            "birth_date": "1999-01-03",
            "gender": "M",
            "is_coach": true,
            "user": 11
        },
        "fav_sport": [
            {
                "id": 2,
                "name": "Swimming",
                "raiting": 3
            },
            {
                "id": 3,
                "name": "soccer",
                "raiting": 2
            }
        ]
    }

модель спортивного типа

class SportTypeDB(models.Model):
    name = models.CharField(verbose_name='name', max_length=255, unique=True)
    raiting = models.IntegerField(default=1, validators=[MaxValueValidator(5), MinValueValidator(1)])

точечный сериализатор типов

class SportTypeSerializer(serializers.ModelSerializer):
    class Meta:
        model = SportTypeDB
        fields = '__all__'

модель человека:

class PersonDB(models.Model):
    GENDER_CHOICES = (
        ('M', 'Male'),
        ('F', 'Female'),
        ('D', 'Different'),
    )
    user = models.OneToOneField(User, on_delete=models.CASCADE,unique=True)
    first_name = models.CharField(unique=False, max_length=100)
    last_name = models.CharField(unique=False, max_length=100)
    birth_date = models.DateField()
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES,)
    is_coach = models.BooleanField(default=False)

сериализатор персон:


class PersonSerializer(serializers.ModelSerializer):
    class Meta:
        model = PersonDB
        fields = "__all__"

модель стажера:

class TraineeDB(models.Model):
    person = models.OneToOneField(PersonDB, on_delete=models.CASCADE,related_name='person',unique=True)
    fav_sport = models.ManyToManyField(SportTypeDB,  related_name='fav_sport')

обучаемый сериализатор

class TraineeSerializer(serializers.ModelSerializer):
    fav_sport = SportTypeSerializer(many=True, read_only=True)
    person = PersonSerializer(many=False,read_only=True)

 class Meta:
        model = TraineeDB
        fields = ("person","fav_sport")
Вернуться на верх