нельзя использовать разные поля для каждого объекта в сериализаторе django rest framework - PullRequest
0 голосов
/ 10 сентября 2018

Я хочу создать похожее на udemy веб-приложение и использовать инфраструктуру django rest для бэкенда и mysql в качестве базы данных. у меня есть модель под названием «Уроки», которая содержит список всех уроков, а одно из полей - «видео-ссылка». Также у меня есть другое название модели Покупки, которые имеют два поля ForeignKey: Пользователи и Уроки. Я хочу показать Уроки всем пользователям, но для поля загрузки мне нужно найти пару (Пользователь, Урок) в Закупках, и если у него есть курс, я покажу ему поле загрузки.

My View Set

class LessonsViewSet(viewsets.ModelViewSet):
    queryset = models.Assignments.objects.all()
    authentication_classes = (TokenAuthentication,)

    def get_serializer_class(self):
        if self.request.user.is_staff :
            print(self.request.user)
            return serializers.FullAccessLessonsSerializer
        elif self.request.user.is_active:
            return serializers.PartialAccessLessonsSerializer
        print(self.request.user)
        return serializers.BasicAccessLessonsSerializer

Мои сериализаторы

Полный доступ для администраторов:

class FullAccessLessonsSerializer(serializers.ModelSerializer):

    class Meta:
        model = models.Assignments
        fields = ('id', 'title', 'description', 'dllink' )

Базовый доступ для неаутентифицированных пользователей:

class BasicAccessLessonsSerializer(serializers.ModelSerializer):

    class Meta:
            model = models.Assignments
            fields = ('id', 'title', 'description')

и частичный доступ для студентов:

class PartialAccessAssignmentsSerializer(serializers.ModelSerializer):
    """A serializer for all Lessons"""

    def __init__(self, *args, **kwargs):
        fields = kwargs.pop('fields', None)
        super(PartialAccessAssignmentsSerializer, self).__init__(*args,**kwargs)
        print(self.fields.get('id'))
        self.fields.pop('dllink')

    class Meta:
        model = models.Assignments
        fields = ('id','title','description','dllink' )

Я сделал все, что мог найти, но не могу понять. Я либо получаю ошибку, либо удаляю все ссылки dl.

1 Ответ

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

Если вы хотите, чтобы dllink был None, когда пользователь не может получить доступ. Используйте это:

class FullAccessLessonsSerializer(serializers.ModelSerializer):
    dllink = serializers.SerializerMethodField()

    def get_prescription_accept(self, instance):
        result =  True # lookup the pair (User , Lesson) in Purchases
        if result:
           return instance.dllink
        else:
           return ''

    class Meta:
        model = models.Assignments
        fields = ('id', 'title', 'description', 'dllink' )

Если вы хотите всплыть из данных, используйте:

class FullAccessLessonsSerializer(serializers.ModelSerializer):

    def to_representation(self, instance):
        data = super(FullAccessLessonsSerializer, self).to_representation(instance)
        result =  True # lookup the pair (User , Lesson) in Purchases
        if not result:
            data.pop('dllink')
        return data

    class Meta:
        model = models.Assignments
        fields = ('id', 'title', 'description', 'dllink' )
...