Частичное обновление булевых полей в Django не обновляет поле в базе данных

Я пытаюсь обновить булевы поля с помощью PATCH запроса и partial-update в DRF. Однако обновляется только поле имени, а не другие

Модель:

class UserModel():
    name = models.CharField(max_length=64)
    enabled = models.BooleanField(default=False)
    admin = models.BooleanField(default=False)   

Serializer

class UserSerializer():
    class Meta:
        model = UserModel
        fields = (
            'id', 'name', 'enabled', 'admin'
        )
        read_only_fields = ('id',)

Вид и функция

class UserView():
    def get_queryset(self):
        return User.users.for_company(company=self.request.company.pk)

    def get_serializer_class(self):
        return UserSerializer

    def update(self, request, id):
        try:
            instance = self.get_queryset().get(id=id)
        except User.DoesNotExist:
            return Response('User not in DB', status=status.HTTP_404_NOT_FOUND)

        if 'name' in request.data and self.get_queryset().filter(name=request.data['name']).exists():
            return Response('Duplicated user name', status=status.HTTP_400_BAD_REQUEST)

        serializer = self.get_serializer(instance, data=request.data, partial=True)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(serializer.data, status=status.HTTP_200_OK)

Url

urlpatterns = [ url(r'^(?P<id>${uuid})/$', UserView.as_view(
        {'patch': 'update'}), name='user-update') ]

В настоящее время, если я посылаю запрос PATCH с идентификатором пользователя и следующими данными в теле, только поле имени обновляется в БД.

name = user2
enabled = True
admin = True

Однако если я изменю метод обновления следующим образом, БД обновится правильно

    def update(self, request, id):
        try:
            instance = self.get_queryset().get(id=id)
        except User.DoesNotExist:
            return Response('User not in DB', status=status.HTTP_404_NOT_FOUND)

        if 'name' in request.data and self.get_queryset().filter(name=request.data['name']).exists():
            return Response('Duplicated user name', status=status.HTTP_400_BAD_REQUEST)

        serializer = self.get_serializer(instance, data=request.data, partial=True)

        if 'enabled' or 'admin' in request.data:
            instance.enabled = request.data.get('enabled', instance.enabled)
            instance.admin = request.data.get('admin', instance.admin)

        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(serializer.data, status=status.HTTP_200_OK)

Правильный ли это способ обновления полей путем изменения экземпляра? Разве метод частичного обновления Django не должен позаботиться об этом, если я передаю другие булевы поля в запросе, и правильно обновить их в базе данных?

Я исследовал дальше и понял, что serializer.save() вызывает instance.save() под капотом, и проверяет данные, только поля имени проходят как проверенные данные, а не два других поля boolean.

Вернуться на верх