Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在django rest框架中注册新用户(自定义)?_Django_Python 2.7_Django Rest Framework_Django Rest Auth - Fatal编程技术网

如何在django rest框架中注册新用户(自定义)?

如何在django rest框架中注册新用户(自定义)?,django,python-2.7,django-rest-framework,django-rest-auth,Django,Python 2.7,Django Rest Framework,Django Rest Auth,当我创建新用户时,不会创建相应的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

当我创建新用户时,不会创建相应的
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
EDIT:我尝试采用这种方法,但出现了一个错误,用户没有这些属性(即
“某些字段为空!”

# 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 to/user/来更改这些字段,并且不想进行扩展序列化程序的练习)


但是,如果脚本也不起作用…可能是信号设置不正确?我在原始代码中没有看到任何post_保存信号

我没有看到任何在非DRF情况下创建基本用户的代码…您当前是否遇到这种情况?例如,如果您使用manage.py命令创建用户,则不会。可以吗您建议使用任何其他方式来执行itI,我认为这不会起作用,因为该信号不会具有部门和用户类型,因为实际的模型定义不会……另一个解决方案是在BaseUserSerializer中扩展ModelSerializer的perform_create,将其拆分为创建两个模型。但是如果您希望所有用户都具有这些字段,则可能会同样,只需扩展用户模型“扩展用户模型”-你是指扩展
AbstractBaseUser
?是的,还是AbstractUser(如果你想保留所有默认行为并扩展它),它将使你不必为让序列化程序同时写入两个位置而争吵(例如,如果你想通过REST调用更新类型和电子邮件)是的,我想我必须继承
AbstractBaseUser
。谢谢你的帮助!