【问题标题】:Remove fields of a HyperlinkedModelSerializer's ForeignKey based on the base request parameters根据基本请求参数删除 HyperlinkedModelSerializer 的 ForeignKey 的字段
【发布时间】:2016-08-21 19:19:15
【问题描述】:

目前我有:

class PlayerSerializer(serializers.HyperlinkedModelSerializer):
    id = serializers.ReadOnlyField()

    class Meta:
        model = Player

    def __init__(self, *args, **kwargs):
        super(PlayerSerializer, self).__init__(*args, **kwargs)

        self.is_full = self.context['request'].query_params.get('full', False)

        if not self.is_full:
            base_fields = ['nation', 'club', 'slug', 'common_name', 'image', 'position', 'quality', 'overall_rating',
                           'card_att_1', 'card_att_2', 'card_att_3', 'card_att_4', 'card_att_5', 'card_att_6']

            for field in self.fields:
                if field not in base_fields:
                    self.fields.pop(field)

        self.fields['nation'] = NationSerializer(is_full=self.is_full)
        self.fields['league'] = LeagueSerializer(is_full=self.is_full)
        self.fields['club'] = ClubSerializer(is_full=self.is_full)

效果很好,但 ClubSerializer

class ClubSerializer(serializers.HyperlinkedModelSerializer):
    id = serializers.ReadOnlyField()
    league = LeagueSerializer()

我希望LeagueSerializer 具有基于请求查询参数值的字段。是否只是不将其作为 kwarg 传递并单独对每个 Serializer 进行 self.is_full = self.context['request'].query_params.get('full', False) 检查的情况?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    我对每个序列化程序都进行了检查,因此即使我没有手动构建序列化程序(例如在ViewSets 中),逻辑仍然有效。

    【讨论】:

    • 是的,我想我在发布这篇文章后意识到我有一点橡皮鸭的时刻,谢谢:)
    • 没关系,我刚刚意识到,ForeignKeys (league = LeagueSerializer()) 没有 self.context['request'] 能够进行检查。
    • 为什么不呢?每个序列化程序都会将request 作为上下文的一部分。只需放置一个像这样的构造函数 - def __init__(self, *args, **kwargs): 并确保调用 super 并且您将得到 context 作为 context = kwargs.get('context', None) 并且 context 将具有 requestrequest = kwargs['context']['request']
    • 这个问题似乎反映了我遇到的问题:github.com/tomchristie/django-rest-framework/issues/2555
    猜你喜欢
    • 2016-09-25
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 2016-09-30
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    相关资源
    最近更新 更多