В django rest; я пытаюсь POST артиста с отношением ForeignKey.

Я хотел бы добавить данные в таблицу, которая имеет связь по внешнему ключу с моделью пользователя через Django Rest API.

models.py:

class Artiste(models.Model):
    slug = models.SlugField(unique=True)
    name =  models.CharField(max_length=200)
    name_vo =  models.CharField(max_length=200, blank=True, null=True)
    name_vo_romanji = models.CharField(max_length=200, blank=True, null=True)
    biographie = models.TextField(blank=True, null=True)
    image = models.ImageField(upload_to=artiste_get_upload_to, blank=True, null=True)
    date_birth = models.DateTimeField(blank=True, null=True)
    date_death =  models.DateTimeField(blank=True, null=True)
    nationnality = models.ForeignKey(Countrie, related_name='Artiste_countrie', on_delete=models.CASCADE, null=True)
    profession = models.ManyToManyField(Profession, related_name='Artiste_profession', blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

class Countrie(models.Model):
    slug = models.SlugField(unique=True)
    code = models.CharField(unique=True, max_length=2)
    name = models.CharField(unique=True, max_length=200)
    nationnality = models.CharField(unique=True, max_length=200)
    image = models.ImageField(upload_to=countrie_get_upload_to, null=True)

serializers.py:

class ArtisteSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    slug = serializers.SlugField(required=False)
    name =  serializers.CharField()
    name_vo =  serializers.CharField(required=False)
    name_vo_romanji = serializers.CharField(required=False)
    biographie = serializers.CharField(style={'base_template': 'textarea.html'}, required=False)
    image = serializers.ImageField(required=False)
    date_birth = serializers.DateTimeField(required=False)
    date_death =  serializers.DateTimeField(required=False)
    nationnality = CountrieSerializer(required=False)
    profession = ProfessionSerializer(many=True, required=False)
    created_at = serializers.DateTimeField(read_only=True)
    updated_at = serializers.DateTimeField(read_only=True)

    def create(self, validated_data):
        print(validated_data)
        return Artiste.objects.create(**validated_data)

    def update(self, instance, validated_data):
        instance.slug = validated_data.get('slug', instance.code)
        instance.name = validated_data.get('name', instance.name)
        instance.name_vo = validated_data.get('name_vo', instance.name_vo)
        instance.name_vo_romanji = validated_data.get('name_vo_romanji', instance.name_vo_romanji)
        instance.biographie = validated_data.get('biographie', instance.biographie)
        instance.image = validated_data.get('image', instance.image)
        instance.date_birth = validated_data.get('date_birth', instance.date_birth)
        instance.date_death = validated_data.get('date_death', instance.date_death)
        instance.nationnality = validated_data.get('nationnality', instance.nationnality)
        instance.save()
        return instance

class CountrieSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    slug = serializers.SlugField(required=False)
    code = serializers.CharField()
    name = serializers.CharField()
    nationnality = serializers.CharField()
    image = serializers.ImageField(required=False)

    def create(self, validated_data):
        return Countrie.objects.create(**validated_data)

    def update(self, instance, validated_data):
        instance.slug = validated_data.get('slug', instance.code)
        instance.code = validated_data.get('code', instance.code)
        instance.name = validated_data.get('name', instance.name)
        instance.nationnality = validated_data.get('nationnality', instance.nationnality)
        instance.image = validated_data.get('image', instance.image)
        instance.save()
        return instance

Я хотел бы иметь эти данные, когда я публикую нового артиста.

{
    'name': 'Bob lenon',
    'name_vo': 'test5',
    'name_vo_romanji': 'test5',
    'nationnality': 1,
}

Когда я печатаю validated_data из ArtisteSerialiser, у меня есть только это {'name': 'test5', 'name_vo': 'test5', 'name_vo_romanji': 'test5'}, но я отправил данные о национальности

Вы должны написать строку 'nationnality = CountrieSerializer(required=False)' в вашем ArtisteSerializer . Я даю совет вам ModelSerializer, который формирует rest_framework.serializer import . Потому что в нем вы пишете не обязательно каждое поле, вы просто пишете их include fields = ()

Вернуться на верх