2016-11-22 47 views
1

在Views.py中返回对象之前修改对象存在一个小问题。我的情况是,我必须隐藏/修改未订阅用户的模型对象的某些值。我当前的代码是这样的(伪代码):修改视图中的对象值,而无需使用django修改数据库值

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

你可能已经有一个Shows对象,每一个序列化属性的serializer

我的建议是创建另一个序列化程序,例如UnsubscribedUserShowSerializer,它总是在video属性中具有None

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并且可以轻松地定制要取消订阅用户隐瞒值。

0

通过调用.save()方法,您正在覆盖字段的值。您可以退订用户这样 视频= shows.video 申请检查如果没有user_subscribed: 视频= 0