在Django rest框架中检索明细对象时更改模型中的字段

时间:2019-01-09 03:27:55

标签: python django django-rest-framework

我的模型如下:

class PPost(models.Model):
    owner = models.ForeignKey(
        get_user_model(),
        related_name='posts4thisowner',
        on_delete=models.CASCADE)

    furnished = models.BooleanField(verbose_name="Is Furnished", default=False,null=True,blank=True)
    description = models.TextField(verbose_name="Description", max_length=500, blank=True, null=True)
    viewnum=models.IntegerField(verbose_name="view num", default=0)
    timestamp = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ('timestamp',)

我的详细视图如下:

class PPostDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = PPost.objects.all()
    serializer_class = PPostSerializer
    name = 'ppost-detail'
    permission_classes = (
        permissions.IsAuthenticatedOrReadOnly,
        custompermission.IsCurrentUserOwnerOrReadOnly,
    )

将在以下网址中使用:

urlpatterns = [
    ...
    path('<int:pk>', views.PPostDetail.as_view(), name=views.PPostDetail.name),
]

现在我需要能够增加viewnum,模型中的一个字段表示每当request.GET被调用时帖子的查看数量就增加一;我想知道如何实现这一目标。 谢谢

1 个答案:

答案 0 :(得分:0)

覆盖视图类的 dispatch() 方法,请参见示例

class PPostDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = PPost.objects.all()
    serializer_class = PPostSerializer
    name = 'ppost-detail'
    permission_classes = (
        permissions.IsAuthenticatedOrReadOnly,
        custompermission.IsCurrentUserOwnerOrReadOnly,
    )

    def dispatch(self, request, *args, **kwargs):
        ppost_object = self.get_object()
        ppost_object.viewnum += 1
        ppost_object.save()
        return super(PPostDetail, self).dispatch(request, *args, **kwargs)

在Django文档中,dispatch() method

  

视图的视图部分–接受请求参数的方法   加参数,然后返回HTTP响应。

     

默认实现将检查HTTP方法并尝试   委托给与HTTP方法匹配的方法; GET将   委托给get(),委托给post(),等等。

     

默认情况下,将HEAD请求委托给get()。如果你需要   以不同于GET的方式处理HEAD请求,您可以覆盖   head()方法。有关示例,请参见支持其他HTTP方法。