【问题标题】:How to update a model record in Django-Rest如何在 Django-Rest 中更新模型记录
【发布时间】:2018-10-26 19:04:17
【问题描述】:

我想用 Dango-Rest-Framework 的老师的名字为一所学校制作一个调查 Api。我想创建一种方法,以便用户可以发布教师的姓名(或教师模型中教师的 id)并自动将一个点添加到该教师的点字段。

这是我的教师模型课:

class Teacher(models.Model):
     name = models.CharField(max_length=255)
     description = models.TextField(blank=True,null=True)
     voting = models.IntegerField(default=0)

和views.py:

class TeachersViewSet(viewsets.ModelViewSet):
    queryset = models.Teachers.objects.all()
    serializer_class = serializers.TeachersSerializer
    authentication_classes = (TokenAuthentication,)

所以我想要的是,在前端用户可以调用 api 并告诉该老师的投票字段加 1 分(他们不需要提及数字 1。因为 api 总是必须为每个请求)。我必须创建一个新的视图集吗?老实说,我不知道从哪里开始;所以任何帮助将不胜感激。

【问题讨论】:

  • 您是否真的想要覆盖更新机制(因此您不能使用普通的 REST 接口进行更新),或者您是否想要一个除了增加 voting 之外什么都不做的单独 url领域?

标签: django django-rest-framework


【解决方案1】:

查看 DRF 的 routing for extra actions。我觉得它超级有用。在您的情况下,您可以添加如下内容:

class TeachersViewSet(viewsets.ModelViewSet):
    ...
    @action(detail=True)
    def vote(self, request, pk=None):
        Teacher.objects.filter(pk=pk).update(voting=F('voting') + 1)
        return Response()

假设您使用的是 DRF 的标准路由,这将提供一个类似于 /api/teachers/[id]/vote 的 URL。当然,这里有很多修改,但这是一个起点。

【讨论】:

    【解决方案2】:

    ViewSet's Update method 公开为一个 API,该 API 接受教师 ID 并将其添加到投票中

    覆盖update 方法。

    class TeachersSerializer(ModelSerializer):
        def update(self, instance, validated_data):
            instance.vote += 1
            instance.save()
            return instance
    

    【讨论】:

    • 谢谢。但我认为也许有一件事是不正确的。因为我收到了这个错误:“update() got an unexpected keyword argument 'pk'”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-09
    • 2011-04-10
    • 1970-01-01
    • 2020-07-08
    • 2020-04-16
    • 2015-01-28
    相关资源
    最近更新 更多