Ранее я проверял ввод моей модели в сериализаторе, но мне пришлось перейти к проверке в модели, используя унаследованные свойства от AbstractUser
.
На мой взгляд, в настоящее время у меня есть следующее:
class SetUserProfileView(generics.UpdateAPIView):
"""
Use this endpoint to change user profile.
"""
serializer_class = settings.SERIALIZERS.user_update_profile
permission_classes = [permissions.IsAuthenticated]
def get_object(self):
return self.request.user
def patch(self, request):
testmodel = self.get_object()
serializer = self.serializer_class(testmodel, data=request.data, partial=True)
if serializer.is_valid():
serializer.save()
return Response(data=serializer.data, status=status.HTTP_200_OK)
return Response(data=serializer._errors, status=status.HTTP_400_BAD_REQUEST)
но это возвращает статус 200 и не обновляет поле роли, если я отправляю строку нулевой длины для роли
Это несмотря на то, что в роли есть ограниченияв models.py, что поле должно быть в ROLE_CHOICES
Как мне обновить мое представление, чтобы убедиться, что данные в модели правильные с использованием проверки в модели?Я не могу найти упоминания о
Модель:
class SeaUser(AbstractUser):
...
SARGENT_PEPPER = 'SGT'
COLENAL_MUSTARD = 'COL'
OTHER = 'OTH'
ROLE_CHOICES = (
(SARGENT_PEPPER, _('sargent')),
(COLENAL_MUSTARD, _('colenal')),
(OTHER, _('Other')),
)
role = models.CharField(_('Role'), max_length=3, choices=ROLE_CHOICES, default=CREW)
role
должно быть одним из 3 значений.Я проверяю это с помощью следующего:
def test_update_user_no_role(self):
payload = {"first_name": "foo",
"last_name": "bar",
"role": "",
"preferred_timezone": "UTC"
}
response = self.request_update_user(payload)
modified_user = self.user_model.objects.get(username=self.user_details['username'])
print('mofified role: ', modified_user.role)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertEqual(self.user.role, modified_user.role)
сериализатор:
class SeaUserCreateSerializer(UserCreateSerializer):
class Meta:
model = User
fields = ('id',...,'role', 'gdpr',..)
def validate_gdpr(self, value):
if not validate_user_gdpr(value):
raise serializers.ValidationError("GDPR must be accepted.")
return value
view: