В 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 = ()