Django Rest Framework - вернуть другой сериализатор в одном наборе - PullRequest
0 голосов
/ 16 сентября 2018

У меня есть две модели: где

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

Однако, кажется, я делаю это только для набора, но не могу фильтровать на уровне отдельного объекта.

1 Ответ

0 голосов
/ 16 сентября 2018

Если вам нужно изменить представление объекта на основе какого-либо атрибута, вы можете переопределить метод сериализатора 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...