如何访问“自定义用户模型”的字段

时间:2019-12-02 23:16:25

标签: django-rest-framework django-rest-auth

由于我要编写与自定义用户模型相关的查询,因此如何访问“自定义用户模型”的字段

使用OneToOneField的简单用户模型有很多示例,但customUserModel提供的支持不足

第1部分 如果我想访问/提及创建调查的人的用户名 如果我写self.request.UserProfile,我在哪里出错 代替perform_create函数中的self.request.User指的是views.py文件

第2部分 现在第二部分 我想访问当前登录用户的phone_number和user_type 如何从custom_user_model构成查询,以便获得要在序列化程序中编写的字段

这是我编写的示例代码 views.py

## for Generic API Views
from rest_framework import generics
from rest_framework import mixins

class PollListView(generics.GenericAPIView, 
                    mixins.ListModelMixin,
                    mixins.CreateModelMixin,
                    mixins.RetrieveModelMixin,
                    mixins.UpdateModelMixin):
    serializer_class = QuestionSerializers
    queryset = Questions.objects.all()
    lookup_field = 'id'
    ## permissions

    ## ListModelMixin > listing all the objects
    ## retrive > getting a single object
    def get(self, request, id=None):
        if id:
            return self.retrieve(request, id)
        else:
            return self.list(request)

    ## CreateModelMixin
    def post(self, request):
        return self.create(request)

    def perform_create(self, serializer):
        serializer.save(created_by=self.request.User)

    # ## UpdateModelMixin
    # def put(self, request, id=None):
    #     return self.update(request, id)

    # def perform_update(self, serilaizer):
    #     serilaizer.save(created_by=self.request.user)

    ## deleting the object
    def delete(self, request, id=None):
        return self.destroy(request, id)



class UserProfileViewSet(viewsets.ModelViewSet):
    """SignUp User Details """
    serializer_class = UserProfileSerializer
    queryset = UserProfile.objects.all()
    serialized_data = {'data':serializer_class.data}


    filter_backends = (filters.SearchFilter, )
    search_fields = ('name', 'email','username',)

serializers.py

from rest_framework import serializers

from poll.models import *

class QuestionSerializers(serializers.ModelSerializer):
    class Meta:
        model = Questions
        fields = [
            'id',
            'title',
            'status',
            'created_by'
        ]

    # def create(self, validated_data):
    #     pass

class UserProfileSerializer(serializers.ModelSerializer):


    class Meta:
        model = UserProfile
        fields = ('id', 'username', 'email', 'name',
                        'user_type', 'phone_number', 'password')
        extra_kwargs = {
            'password': {
                'write_only': True,
                'style': {'input_type': 'password'}
            }
        }

    def create(self, validated_data):
        """ Create and return a new user"""
        user = UserProfile.objects.create_user(
            username=validated_data['username'],
            email=validated_data['email'],
            name=validated_data['name'],
            user_type=validated_data['user_type'],
            phone_number=validated_data['phone_number'],
            password=validated_data['password'],
        )

        return user


models.py


from django.db import models
from django.contrib.auth.models import User

from django.contrib.auth.models import BaseUserManager
from django.contrib.auth.models import AbstractBaseUser
from phone_field import PhoneField

from django.conf import settings

class Questions(models.Model):
    title = models.TextField(null = True, blank = True)
    status = models.CharField(default='inactive', max_length=10)
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.CASCADE)

    start_date = models.DateField(null=True, blank=True)
    end_date = models.DateTimeField(null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return  self.title


class User_manager(BaseUserManager):
    def create_user(self, username, email, name, 
                        user_type, phone_number, password):

        email = self.normalize_email(email)
        user = self.model(username=username, email=email, name=name,
                          user_type=user_type, phone_number=phone_number,)

        user.is_active = True
        user.set_password(password)
        user.save(using=self.db)

        return user

    def create_superuser(self, username, email, name, 
                        user_type, phone_number,password):

        user = self.create_user(username=username, email=email, name=name,
                                user_type=user_type, phone_number=phone_number, 
                                password=password)

        user.is_superuser = True
        user.is_staff = True
        user.save(using=self._db)

        return user


class UserProfile(AbstractBaseUser):

    username = models.CharField(max_length=32, unique=True,)
    email = models.EmailField(max_length=32, unique=True,)

    name = models.CharField(max_length=32, blank=False,)

    ##user_type
    role_types = [("FRE","Free"),
                ("NGO","Non Government Organisations"),
                ("GOV","Government"),
                ("SUP", "SuperUser")]

    user_type = models.CharField(choices = role_types,
                                blank=False,
                                max_length = 3)

    phone_number = PhoneField(unique=True,
                                    blank=False,)

    date_created = models.DateField(auto_now_add = True)

    # overridden fields
    is_active = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)

    REQUIRED_FIELDS = ["email", "name",
                         "user_type", "phone_number",]

    USERNAME_FIELD = "username"
    objects = User_manager()

    def get_full_name(self):
        """ Retrive full Name """
        return self.name

    def __str__(self):
        return self.username




0 个答案:

没有答案
相关问题