![](/img/trans.png)
[英]How to serialize each foreign key object with different serializer class in django rest framework
[英]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.