修改视图中的对象值,而不使用django

时间:2016-11-22 20:26:08

标签: django django-models django-views django-rest-framework

在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。我希望未订阅的用户可以预览订阅用户的内容,但不会看到该视频。谢谢!

2 个答案:

答案 0 :(得分:2)

您的Shows个对象可能已经有一个serializer,它会对每个属性进行序列化。

我的建议是创建另一个序列化工具,比如UnsubscribedUserShowSerializerNone属性中始终有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