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"
}
Вернуться на верх