首页 > 解决方案 > Django Rest Framework - 在同一视图集中返回不同的序列化程序

问题描述

我有两个模型:哪里

class Hunter(Model):
    name = CharField()

搜索

class Target(Model):
    name = CharField()
    user = ForeignKey(User) 
    approved_hunters = ManyToManyField(Hunter)

我的序列化程序是

class AnonymousTargetSerializer(ModelSerializer):
    class Meta:
        name = 'target'
        model = Target
        fields = ['id',]

并且

class TargetSerializer(ModelSerializer):
    class Meta:
        name = 'target'
        model = Target
        fields = ['id',]

我的观点集我想:

hunter = Hunter.objects.get(user=self.request.user)
if hunter in Target.approved_hunters.all()
    return TagetSerializer
else:
    return AnonymousTargetSerializer

但是,我似乎只为视图集完成了这项工作,但无法在单个对象级别进行过滤。

标签: pythondjangodjango-rest-framework

解决方案


如果您需要根据某些属性修改对象的表示,您可以覆盖序列化程序的to_representation方法:

class TargetSerializer(ModelSerializer):
    class Meta:
        name = 'target'
        model = Target
        fields = ['id',]

    def to_representation(self, obj):
        hunter = Hunter.objects.get(user=self.context['request'].user)
        if hunter not in Target.approved_hunters.all():
            return AnonymousTargetSerializer(obj).data
        return super().to_representation(obj)

在视图集中,您不需要任何自定义,只需使用TargetSerializer

serializer_class = TargetSerializer

推荐阅读