2016-11-22 46 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