我应该如何在 django rest 框架中注册新用户(自定义)?
How should I register a new user(custom) in django rest framework?
每当我创建新用户时,都不会创建相应的 BaseUser
。信号工作正常,因为我检查过没有属性 department
和 user_type
我该如何注册 BaseUser
?
# models.py
from django.db import models
from django.conf import settings
from django.contrib.auth.models import User
class BaseUser(models.Model):
# TODO: Add a class with static method to return the list of departments(choices)
# TODO: (REMINDER) To add placeholder that username is rollnumber
USER_TYPES = (
(0, 'Student'),
(1, 'Professor'),
(2, 'Guest'),
)
user = models.OneToOneField(User, primary_key=True,
related_name='user')
department = models.CharField(max_length=3, default='CSE')
user_type = models.IntegerField(choices=USER_TYPES, default=0)
REQUIRED_FIELDS = [
'department',
'email',
'first_name',
'user_type'
]
def get_user_type(self):
return self.USER_TYPES[self.user_type][1]
def __unicode__(self):
return str(
dict((
self.user.user_name,
self.get_user_type(),
))
)
# serializers.py
from django.contrib.auth.models import User
from rest_framework import serializers
from authentication.models import BaseUser
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = (
'id',
'username',
'first_name',
'email'
)
class BaseUserSerializer(serializers.ModelSerializer):
user = UserSerializer()
user_type = serializers.SerializerMethodField()
class Meta:
model = BaseUser
fields = (
'user',
'user_type',
'department',
)
def get_user_type(self, obj):
return obj.get_user_type()
# views.py
from django.shortcuts import render
from django.contrib.auth.models import User
from rest_framework import viewsets
from rest_framework.decorators import detail_route, list_route
from authentication.models import BaseUser
from authentication.serializers import BaseUserSerializer, UserSerializer
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
编辑: 我试图遵循 this 方法,但我收到一个错误,提示用户没有这些属性(即 'Some fields are empty!'
# signals.py
# I have another signal in signals.py and it is working fine.
@receiver(post_save, sender=User)
def create_user_handler(sender, instance, created, **kwargs):
if created:
attrs_needed = ['department', 'user_type']
if all(hasattr(instance, attr) for attr in attrs_needed):
base_user = BaseUser(
user=instance,
department=instance.department,
user_type=instance.user_type,
)
base_user.save()
else:
print "Some fields are empty!"
# views
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
@list_route(methods=['post'])
def create_baseuser(self, request):
print request.DATA['username']
user = User.objects.create_user(
username=request.DATA['username'],
password=request.DATA['password'],
email=request.DATA['email'],
first_name=request.DATA['first_name']
)
user.department = request.DATA['department']
user.user_type = request.DATA['user_type']
user.save()
return Response(data='{"detail":"created"')
如果所有用户都将拥有这些类型,我建议使用自定义用户模型进行扩展,以减少与序列化程序相关的麻烦(特别是如果您希望能够 POST/PUT 到 /user/ 到更改这些字段并且不想经历扩展序列化程序的练习)https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#specifying-a-custom-user-model
但是如果它在您的脚本上也不起作用...也许您的信号设置不正确?我在您的原始代码
中没有看到任何 post_save 信号
每当我创建新用户时,都不会创建相应的 BaseUser
。信号工作正常,因为我检查过没有属性 department
和 user_type
我该如何注册 BaseUser
?
# models.py
from django.db import models
from django.conf import settings
from django.contrib.auth.models import User
class BaseUser(models.Model):
# TODO: Add a class with static method to return the list of departments(choices)
# TODO: (REMINDER) To add placeholder that username is rollnumber
USER_TYPES = (
(0, 'Student'),
(1, 'Professor'),
(2, 'Guest'),
)
user = models.OneToOneField(User, primary_key=True,
related_name='user')
department = models.CharField(max_length=3, default='CSE')
user_type = models.IntegerField(choices=USER_TYPES, default=0)
REQUIRED_FIELDS = [
'department',
'email',
'first_name',
'user_type'
]
def get_user_type(self):
return self.USER_TYPES[self.user_type][1]
def __unicode__(self):
return str(
dict((
self.user.user_name,
self.get_user_type(),
))
)
# serializers.py
from django.contrib.auth.models import User
from rest_framework import serializers
from authentication.models import BaseUser
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = (
'id',
'username',
'first_name',
'email'
)
class BaseUserSerializer(serializers.ModelSerializer):
user = UserSerializer()
user_type = serializers.SerializerMethodField()
class Meta:
model = BaseUser
fields = (
'user',
'user_type',
'department',
)
def get_user_type(self, obj):
return obj.get_user_type()
# views.py
from django.shortcuts import render
from django.contrib.auth.models import User
from rest_framework import viewsets
from rest_framework.decorators import detail_route, list_route
from authentication.models import BaseUser
from authentication.serializers import BaseUserSerializer, UserSerializer
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
编辑: 我试图遵循 this 方法,但我收到一个错误,提示用户没有这些属性(即 'Some fields are empty!'
# signals.py
# I have another signal in signals.py and it is working fine.
@receiver(post_save, sender=User)
def create_user_handler(sender, instance, created, **kwargs):
if created:
attrs_needed = ['department', 'user_type']
if all(hasattr(instance, attr) for attr in attrs_needed):
base_user = BaseUser(
user=instance,
department=instance.department,
user_type=instance.user_type,
)
base_user.save()
else:
print "Some fields are empty!"
# views
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
@list_route(methods=['post'])
def create_baseuser(self, request):
print request.DATA['username']
user = User.objects.create_user(
username=request.DATA['username'],
password=request.DATA['password'],
email=request.DATA['email'],
first_name=request.DATA['first_name']
)
user.department = request.DATA['department']
user.user_type = request.DATA['user_type']
user.save()
return Response(data='{"detail":"created"')
如果所有用户都将拥有这些类型,我建议使用自定义用户模型进行扩展,以减少与序列化程序相关的麻烦(特别是如果您希望能够 POST/PUT 到 /user/ 到更改这些字段并且不想经历扩展序列化程序的练习)https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#specifying-a-custom-user-model
但是如果它在您的脚本上也不起作用...也许您的信号设置不正确?我在您的原始代码
中没有看到任何 post_save 信号