不能为序列化程序 Django 休息框架中的每个对象使用不同的字段
can not use different fields for each object in serializer django rest framework
我想创建一个类似 udemy 的网络应用程序,并使用 django rest 框架作为后端,mysql 作为数据库。
我有一个名为 'Lessons' 的模型,其中包含所有课程的列表,其中一个字段是 'video-link'。我还有另一个模型名称 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 而用户不能 access.use 这个:
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' )
我想创建一个类似 udemy 的网络应用程序,并使用 django rest 框架作为后端,mysql 作为数据库。 我有一个名为 'Lessons' 的模型,其中包含所有课程的列表,其中一个字段是 'video-link'。我还有另一个模型名称 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 而用户不能 access.use 这个:
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' )