Как обновить модель записи в Django-Rest - PullRequest
0 голосов
/ 26 октября 2018

Я хочу сделать Survey Api для школы с именем учителей с помощью Dango-Rest-Framework. Я хочу создать способ, чтобы пользователи могли публиковать имя учителя (или идентификатор учителя в модели учителя) и автоматически добавлять одну точку в поле точек этого учителя.

Вот мой класс модели Учитель:

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 всегда должен добавлять 1 балл для каждый запрос). Должен ли я создать новый Viewset? Честно говоря, я не знаю, с чего начать; поэтому любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Проверьте маршрутизацию DRF для дополнительных действий .Я нахожу это супер полезным.В вашем случае вы могли бы добавить что-то вроде этого:

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, это будет приводить к URL-адресу в виде строк /api/teachers/[id]/vote.Конечно, много изменений здесь, но это отправная точка.

0 голосов
/ 26 октября 2018

Представьте ViewSet's Update method как API, который принимает идентификатор учителя и добавляет один к его голосу.

Переопределить update метод.

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