不能在序列化程序django rest框架中为每个对象使用不同的字段

问题描述 投票:0回答:1

我想创建一个像web应用程序的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

My Serializers

管理员的完全访问权限:

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链接。

python django django-rest-framework django-views django-serializer
1个回答
1
投票

如果你想在用户无法访问时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' )

如果你想从数据中弹出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' )
© www.soinside.com 2019 - 2024. All rights reserved.