【问题标题】:Modify an objects value in Views without modifying the data base value with django在视图中修改对象值而不用 django 修改数据库值
【发布时间】:2016-11-22 20:26:07
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您的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,并且可以轻松自定义要对未订阅用户隐藏的值。

    【讨论】:

      【解决方案2】:

      通过调用 .save() 方法,您将覆盖字段的值。您可以通过这种方式为未订阅用户申请支票 视频=显示.视频 如果不是 user_subscribed: 视频 = 0

      【讨论】:

        猜你喜欢
        • 2018-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-15
        • 2016-09-24
        • 2021-04-23
        • 2021-04-30
        相关资源
        最近更新 更多