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())
Вернуться на верх