UpdateAPIView | Django REST не обновляет данные должным образом
Я хочу регистрировать значения в таблице отношений при обновлении данных. И наоборот, я хочу генерировать ошибку, если значение не существует.
models.py
class CustomUser(AbstractBaseUser, PermissionsMixin):
uuid = models.UUIDField(default=uuid.uuid4, primary_key=True,
editable=False)
email = models.EmailField(_('email address'), unique=True)
role = models.OneToOneField('Role', related_name='user',
blank=True, null=True,
on_delete=models.PROTECT)
# ommited...
class Role(models.Model):
slug = models.SlugField(unique=True)
def __str__(self):
return self.slug
serializers.py
from drf_writable_nested import WritableNestedModelSerializer
from rest_framework import serializers
from accounts.models import CustomUser, Role
class RoleSerializer(serializers.ModelSerializer):
class Meta:
model = Role
fields = ('slug',)
class UserSerializer(WritableNestedModelSerializer):
role = RoleSerializer()
class Meta:
model = CustomUser
fields = ('uuid', 'email', 'role', 'password')
extra_kwargs = {'password': {'write_only': True, 'required': True}}
def create(self, validated_data):
return CustomUser.objects.create_user(**validated_data)
views.py
class UserUpdateView(generics.UpdateAPIView):
queryset = CustomUser.objects.all()
serializer_class = UserSerializer
Таблица БД Роль
id:1 | slug:admin
Ожидание
Запрос(PATCH) Параметр
{
"role":{
"slug":"foo"
}
}
# error: foo does not exist in the Role table
{
"role":{
"slug":"admin"
}
}
# OK!!!
Что мне делать?
Попробуйте использовать SlugRelatedField
:
class UserSerializer(WritableNestedModelSerializer):
role = serializers.SlugRelatedField(slug_field='slug')
class Meta:
model = CustomUser
fields = ('uuid', 'email', 'role', 'password')
extra_kwargs = {'password': {'write_only': True, 'required': True}}
def create(self, validated_data):
return CustomUser.objects.create_user(**validated_data)
В этом случае запрос должен быть не вложенным:
{
"role":"foo"
}