Частичное обновление булевых полей в 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.