簡體   English   中英

不能為序列化器Django Rest框架中的每個對象使用不同的字段

[英]can not use different fields for each object in serializer django rest framework

我想創建一個像Web應用程序這樣的udemy,並使用django rest框架作為后端和mysql作為數據庫。 我有一個名為“課程”的模型,其中包含所有課程的列表,並且其中一個字段是“視頻鏈接”。 我也有另一個型號名稱Purchases具有兩個ForeignKey字段:Users和Lessons。 我想向所有用戶顯示課程,但對於下載字段,我必須在購買中查找對(用戶,課程),如果他有課程,我將向他顯示下載字段。

我的視圖集

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

如果您希望用戶無法訪問時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' )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM