将一个额外的文件提交到序列化器中,并在Django Rest Framework中使用该字段返回经过验证的数据

时间:2019-05-31 07:18:46

标签: python django django-rest-framework

我知道在这个问题上,人们以前问过一个问题,但是我的情况有所不同,我已经实施了几乎所有发现的解决方案,但是没有一个对我有用。

首先,我在模型中定义了三个类
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 个答案:

答案 0 :(得分:2)

我认为您需要使用 ModelSerializer

class RegistrationSerializer(serializers.Serializer):

to

class RegistrationSerializer(serializers.ModelSerializer):