Django drf serialiser map non pk field to object
У меня есть такая модель языка
class Language(models.Model):
name = models.CharField()
class Post(models.Model)
title = models.CharField()
language = models.ForeignKey(Language, models.SET_DEFAULT, default=1)
class PostSerializer(serializers.ModelSerializer):
language = serializers.CharField(source='language.name')
class PostCreateAPIView(generics.ListCreateAPIView):
serializer_class = serializers.PostSerializer
Получение полезной нагрузки
{
"title":"title_1",
"language": "en" // instead of primary key
}
Я хотел отобразить имя языка в объект без использования pk в полезной нагрузке.
Один из способов сделать это заключается в том, что вы передаете язык с контекстом в сериализатор, а в сериализаторе вы используете SerializerMethodField для получения пк/объекта, используя значение языка.
class PostSerializer(serializers.ModelSerializer): language = serializers.SerializerMethodField()
def get_language(self):
return Language.objects.get(name=self.context["language_name"]) # return anything you want from here.
Передать сериализатор
serialized_data = PostSerializer(data, context={"language_name": self.request.data["language_name"]})
Внутри PostSerializer измените представление языка на SlugRelatedField и установите поле slug в 'name'. Это принимает "имя" из модели Language в поле языка PostSerializer.
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ['title', 'languge']
def get_fields(self):
fields = super().get_fields()
view = self.context.get('view')
if view and view.action == 'create':
fields['language'] = serializers.SlugRelatedField(slug_field='name', queryset=Language.objects.all())
return fields
Необходимо использовать SlugRelatedField
class PostSerializer(serializers.ModelSerializer):
language = serializers.SlugRelatedField(slug_field='name', queryset=Language.objects.all())