Python - Django - изменить поля в сериализаторе - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть следующие настройки:

У меня есть базовое отношение блога и статьи, где я получаю все блоги и связанные с ними статьи:

class BlogSerializer(serializers.ModelSerializer):

    articles = ArticleSerializer(many=True, read_only=True)

    class Meta:
        model = Blog
        fields = ('id', 'name', 'articles')
        depth = 0


class BlogViewSet(ViewSetMixin, GenericAPIView):

    queryset = Blog.objects.all()
    serializer_class = BlogSerializer

Теперь я хочу сохранить вещи какthe are, НО:

Когда вызывается представление списка (например, api / blogs), должны отправляться только идентификаторы статей, поэтому я расширил свой просмотр до:

class BlogViewSet(ViewSetMixin, GenericAPIView, ..):

    queryset = Blog.objects.all()
    serializer_class = BlogSerializer

    def get_serializer(self, *args, **kwargs):
        # pseudo code
        if self.context['request'].action == 'list':
            serializer = super(BlogViewSet, self).get_serializer(*args, *kwargs)
            serializer.fields['articles'] = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
            serializer.is_valid()
            return serializer

я просто хотел переопределить соответствующее поле article с помощью PrimaryKeyRelatedField, чтобы доставлялись только идентификаторы.

Но я получаю пустые результаты (без блогов и статей вообще), и у меня нетидея почему ... какие-либо идеи или предложения?

спасибо и приветствия!

1 Ответ

0 голосов
/ 22 ноября 2018

Попробуйте,

# serializers.py
class BlogSerializer(serializers.ModelSerializer):
    <b>def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if not self.context['view'].action == 'list':
            self.fields['articles'] = ArticleSerializer(many=True, read_only=True)</b>

    <strike>articles = ArticleSerializer(many=True, read_only=True)</strike>  <b># remove this line</b>

    class Meta:
        model = Blog
        fields = ('id', 'name', 'articles')
        <strike>depth = 0</strike>  <b># remove this also....I don't think this is relevant here</b>


# views.py
class BlogViewSet(ViewSetMixin, GenericAPIView):
    queryset = Blog.objects.all()
    serializer_class = BlogSerializer


Что я здесь сделал, мы заставили сериализатор изменить / отобразить articlesполя в сериализаторе ArticleSerializer путем переопределения метода __init__() всякий раз, когда происходит действие представления, которое не является list.По умолчанию DRF примет здесь отношение PrimaryKeyRelatedField.

Надеюсь, это поможет !!

...