在Views.py中返回对象之前,我有一个小问题。我的情况是我必须为未订阅的用户隐藏/修改模型对象中的某些值。我当前的代码是这样的(伪代码):
ShowList(ListAPIView):
def get_queryset(self):
"""
This view should return a list of all the Shows
for the currently authenticated user.
"""
pk = self.kwargs['pk']
shows = Shows.objects.get(id=pk)
return shows
我想要做的是从查询中获取一个对象。例如,我想为名为“video”的对象返回0 / null。我所做的是:
shows.video = 0
shows.save()
return shows
问题是它实际上覆盖了数据库级别中对象的值。我想要的只是在它返回之前暂时更改它。我也试过
permission_classes =(subscription_permission,)
但它会阻止所有views.py。我希望未订阅的用户可以预览订阅用户的内容,但不会看到该视频。谢谢!
答案 0 :(得分:2)
您的Shows
个对象可能已经有一个serializer,它会对每个属性进行序列化。
我的建议是创建另一个序列化工具,比如UnsubscribedUserShowSerializer
,None
属性中始终有video
。
class ShowSerializer(serializers.ModelSerializer):
class Meta:
model = Shows
class UnsubscribedUserShowSerializer(serializers.ModelSerializer):
video = serializers.SerializerMethodField()
class Meta:
model = Shows
def get_video(self, obj):
return None
然后,您将覆盖ShowList
视图' get_serializer_class
:
def get_serializer_class(self):
if self.request.user:
# User is authenticated
return ShowSerializer
else:
return UnsubscribedUserShowSerializer
通过这样做,您不需要覆盖get_queryset
,并且可以轻松自定义要从未订阅用户隐藏的值。
答案 1 :(得分:0)
通过调用.save()方法,您将覆盖字段的值。您可以通过这种方式对未订阅的用户进行检查 video = shows.video 如果不是user_subscribed: video = 0