【问题标题】:Auto increment an element value when a URL is hit using API使用 API 访问 URL 时自动增加元素值
【发布时间】:2021-10-27 18:25:07
【问题描述】:

我是 DRF 的新手,如果这是一个微不足道的问题,我深表歉意。

我想创建一个 API 端点,以便在点击指定 URL 时自动增加数据库中列的值。

例如:

models.py 文件中我有:

class User(models.Model):
  name = models.CharField(null=False, blank=False, max_length=250)
  error= models.IntegerField(null=False, blank=False)

我应该如何编写一个基于类的 API 视图和基于函数的 API 视图,只要关联的 URL 命中,error 的值就会增加 1?

在 URL 中,还应传递行的 ID,例如: localhost:8000/users/error/<id>

点击上述 URL 后,用户 2 的错误值应加一。 下面是我写的功能视图,但是它不能正常工作。 ERROR1:如果 URL 被命中并且数据库中不存在 id,那么响应也是 201

@api_view(['POST'])
@permission_classes([permissions.IsAuthenticatedOrReadOnly])
def updateClick(request, uri_id):

    p = Url_data.objects.filter(uri_id=uri_id).update(clicks=F('clicks')+1)
    print("PPPP: ", p)
    url_obj = Url_data.objects.all()
    serializer = ClickSerializer(url_obj, data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.status_201_CREATED)

    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

谢谢,

【问题讨论】:

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


    【解决方案1】:

    我们可以定义一个 URL 模式:

    path(<strong>'/users/error/&lt;int:pk&gt;/'</strong>, some_view, name='increment-errors'),

    此视图可能如下所示:

    from django.db.models import F
    
    def my_view(request, pk):
        User.objects.filter(pk=pk).update(error=F('error')+1)
        # …

    部分应返回HttpResponse

    通常 GET 请求不应改变实体,因此此类视图通常应由 POST 请求触发。我们可以通过以下方式将视图限制为 POST 请求:

    from django.views.decorators.http import require_POST
    
    @require_POST
    def my_view(request, pk):
        User.objects.filter(pk=pk).update(error=F('error')+1)
        # …

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 2018-06-27
      • 2016-02-29
      • 2013-06-28
      • 1970-01-01
      相关资源
      最近更新 更多