Shezan Kazi
Shezan Kazi

Reputation: 4660

Django Rest Framework - return different serializer in same viewset

I have two models: where

class Hunter(Model):
    name = CharField()

searches for

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

my serializers are

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

and also

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

Im my viewsets I would like to:

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

However I only seem to get this done for the viewset, but cannot filter on an individual object level.

Upvotes: 2

Views: 1442

Answers (1)

neverwalkaloner
neverwalkaloner

Reputation: 47354

If you need to modify representation of object based on some attribute you can override serializer's to_representation method:

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)

In viewset you dont need any customization, just use TargetSerializer:

serializer_class = TargetSerializer

Upvotes: 3

Related Questions