簡體   English   中英

將一個額外的文件提交到序列化器中,並在Django Rest Framework中使用該字段返回經過驗證的數據

[英]Alllow one extra filed into serializer and return validated data with that field in 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'.  

我認為您需要使用ModelSerializer

class RegistrationSerializer(serializers.Serializer):

to

class RegistrationSerializer(serializers.ModelSerializer):

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM