由于我要编写与自定义用户模型相关的查询,因此如何访问“自定义用户模型”的字段
使用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