如何将外键字段包含到用户模型中,并将外键模型字段用于用户序列化程序?

问题描述 投票:0回答:0

这是我的模型.py


class User(AbstractBaseUser, PermissionsMixin, BaseModel):
    STUDENT = '1'
    INSTRUCTOR = '2'
    ADMIN = '3'
    ROLE_CHOICES = (
        (STUDENT, 'student'),
        (INSTRUCTOR, 'instructor'),
        (ADMIN, 'admin')
    )
    id = models.UUIDField(primary_key = True, default = uuid.uuid4, editable = False)
    email = models.EmailField(('email address'),max_length=255)
    username = models.CharField(max_length=255, unique=True ,null=True, blank=True)
    phone_no = encrypt(models.CharField(('phone number'), max_length=15))
    role= models.CharField(max_length=20,choices=ROLE_CHOICES, blank=True, null=True)
    institute = models.ForeignKey(Institute, on_delete=models.SET_NULL, null=True, related_name='institute')
    is_active = encrypt(models.BooleanField(default=True))
    is_staff = encrypt(models.BooleanField(default=False))
    is_superuser = encrypt(models.BooleanField(default=False))

    objects = UserManager()
    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email', 'phone_no']

class Institute(BaseModel):
    id = models.UUIDField(primary_key = True, default = uuid.uuid4, editable = False)
    name = encrypt(models.CharField(max_length=255))
    company_website = models.CharField(max_length=255, blank=True)
    brand_name = models.CharField(max_length=255, blank=True)
    registered_address = models.CharField(max_length=255, blank=True)
    company_pan = models.CharField(max_length=255, blank=True)
    company_tan = models.CharField(max_length=255, blank=True)
    company_gstin = models.CharField(max_length=255, blank=True)

    def institute_id(self):
        return self.id.__str__()

这是我的serializer.py:

class AdminRegisterSerializer(ModelSerializer):
    email = serializers.EmailField(required=True)
    password = serializers.CharField(write_only=True, style={'input_type': 'password'}, required=True)
    institute_name = serializers.CharField(source='User.institute')
    class Meta:
        model = User
        fields = ['email', 'username', 'password', 'institute_name']

我的观点.py:


class AdminRegisterAPIView(CreateAPIView):
    """Here, this API will create a new admin user as previosly while creating/adding user
    the password was not getting hashed so and was not working in log in as well so in order
    to overcome this issue this API was created, `once the user is created main admin/superuser 
    can grant and add other permission to the created admin-user as well`"""
    
    serializer_class = AdminRegisterSerializer
    # permission_classes = [IsAdminUser]  

    def post(self, request, *args, **kwargs):
        data = request.data
        email, username=  data['email'], data['username']
        password, institute = data['password'], data['institute']
        user_obj = User.objects.filter(username=username).first()
        if not user_obj:
            user = User.objects.create(username=username, email=email, institute = institute)
            user.set_password(password)
            user.save()
            return Response(data = {'success' : 'Admin-User registered successfully.'}, status=status.HTTP_200_OK)
        else:
            return Response({"error": "A user with this role already exists."}, status=status.HTTP_400_BAD_REQUEST)
           

这是我到目前为止所做的,但出现错误,我还需要在 views.py 中的 post 方法中发送研究所名称,但研究所是外键是用户模型。

请帮我解决这个问题。提前致谢

直到现在我已经尝试对 serializer.py 进行更改:


    institute_name = serializers.CharField(source='User.institute')
    class Meta:
        model = User
        fields = ['email', 'username', 'password', 'institute_name']

python django-models django-rest-framework django-views django-serializer
© www.soinside.com 2019 - 2024. All rights reserved.