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")