Разрешить одну дополнительную подачу в сериализатор и вернуть проверенные данные с этим полем в Django Rest Framework - PullRequest
0 голосов
/ 31 мая 2019

Я знаю, что по этой теме люди задавали вопрос раньше, но мой случай отличается, и я реализовал почти все решения, которые нашел, но ни одно из них не сработало для меня.

Сначала я определил три класса в моделях:

models.py

class User(AbstractBaseUser, PermissionsMixin):
    """ User Model """

    username = None
    email = models.EmailField(max_length=255, unique=True)
    name = models.CharField(max_length=255)
    agency = models.ForeignKey('agency.Agency', on_delete=models.CASCADE, null=True)
    weekly_email = models.NullBooleanField()
    is_create_new_password = models.NullBooleanField(default=True)
    is_active = models.BooleanField(default=True)
    last_login_time = models.DateTimeField(null=True)
    last_login_from = models.CharField(max_length=255, null=True)
    created_at = models.DateField(default=timezone.now)
    updated_at = models.DateField(default=timezone.now)
    created_by = models.IntegerField(null=True)
    updated_by = models.IntegerField(null=True)


    """ The `USERNAME_FIELD` property tells us which field we will use to log in.
    In this case, we want that to be the email field. """
    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = ["username"]

    """ Tells Django that the UserManager class defined above should manage
    objects of this type. """
    objects = UserManager()  


class Role(models.Model):
    """ Role Model """

    name = models.CharField(max_length=255, unique=True)  


class UserRole(models.Model):
    """ User Role Model """

    user = models.ForeignKey(User, on_delete=models.CASCADE)
    role = models.ForeignKey(Role, on_delete=models.CASCADE)

Тогда я определил свой сериализатор для пользовательского модуля:

serializers.py

class RegistrationSerializer(serializers.ModelSerializer):
    """ Serializers registration requests and creates a new user. """

    user_id = serializers.IntegerField(required=False)
    email = serializers.EmailField(max_length=255)
    name = serializers.CharField(max_length=255)
    agency_id = serializers.IntegerField(source='agency.id', required=False)
    role = serializers.CharField(source='role.name')
    weekly_email = serializers.NullBooleanField()
    last_login_time = serializers.DateTimeField(required=False)
    last_login_from = serializers.CharField(max_length=255, required=False)  

    class Meta:
        model = User
        fields = (
            'role', 'user_id', 'email', 'name', 'agency_id', 'weekly_email', 'last_login_time', 
            'last_login_from'
        )

И, наконец, я определил свой файл представления для создания пользователя:

views.py

class UserCreateAPIView(APIView):
    """ User create Api view class """

    #Allow any user (authenticated or not) to hit this endpoint.
    permission_classes = (IsAuthenticated,)
    serializer_class = RegistrationSerializer

    def post(self, request):
        """ create user using following logic. """

        request.data['user_id'] = request.user.id     
        serializer = self.serializer_class(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save(user=request.user)

        return Response({'message': response['user']['created'], 'data': serializer.data},
            status=status.HTTP_201_CREATED)

Теперь, когда я запускаю его, все работает отлично, как будто пользователь создан, роль создается в соответствии с моими ожиданиями. Мой взгляд, сериализатор и модели извиняются, но в конце этой строки:

return Response({'message': response['user']['created'], 'data': serializer.data},
            status=status.HTTP_201_CREATED)  

Я сталкиваюсь с ошибкой типа

AttributeError: Got AttributeError when attempting to get a value for field `role` on serializer `RegistrationSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `User` instance.
Original exception text was: 'User' object has no attribute 'role'.  

1 Ответ

3 голосов
/ 31 мая 2019

Я думаю, вам нужно использовать ModelSerializer

class RegistrationSerializer(serializers.Serializer):

to

class RegistrationSerializer(serializers.ModelSerializer):
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...