Django REST框架创建自定义用户 [英] Django REST Framework Creating custom user

查看:262
本文介绍了Django REST框架创建自定义用户的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Django领域是新的,但是看到那里有很多魔法。我正在使用Django REST框架并创建允许免费用户注册的应用程序。我的用户需要一些Django用户不可用的其他字段。所以我googled扩展用户。有一个想法,这应该通过创建这样的东西来完成

  class MyUser(models.Model):
user = models.ForeignKey(User,unique = True)
city = models.CharField(max_length = 50,blank = True,default ='')

这是很好,但我有这个序列化器

  class UserSerializer(serializers .ModelSerializer):
class Meta:
model = MyUser
fields =('id','username','password','first_name','last_name','email'城市')

所以,问题是这个序列化器在这里做了一些魔术。它试图找出什么字段应该模型有...
我想让用户在这里列出的字段,这些字段在用户和'城市'是新的自定义字段。 Serializer没有得到它应该在用户模型内。



我在这里缺少什么?如何告诉这个串行器,我想要一些内部用户?我需要能够克隆用户。

解决方案

显然,我没有足够的声誉在一个回答。但是要详细说明Kevin Stone的描述,如果你的模型类似于以下内容:

  class AppUser(models.Model): 
user = models.OneToOneField(User)
ban_status = models.BooleanField(default = False)

您可以执行此操作来创建自定义用户和django用户:

 类AppUserSerializer(序列化程序) ModelSerializer)
username = serializers.CharField(source ='user.username')
email = serializers.CharField(source ='user.email')
password = serializers.CharField ='user.password')
ban_status = serializers.Field(source ='ban_status')

class Meta:
model = AppUser
fields =('id ','username','email','password','ban_status')

def restore_object(self,attrs,instance = None):

给定反序列化字典v可以更新
现有的模型实例,或者创建一个新的模型实例。

如果实例不是无:
instance.user.email = attrs.get('user.email',instance.user.email)
instance.ban_status = attrs.get('ban_status',instance.ban_status)
instance.user.password = attrs.get('user.password',instance.user.password)
返回实例

user = User.objects.create_user(username = attrs.get('user.username'),email = attrs.get('user.email'),password = attrs.get('user.password'))
return AppUser(user = user)


I'm new in Django realm but see there is a lot of "magic" there. I'm using Django REST Framework and creating app that will allow free user registration. My user needs some additional fields that are not available in Django user. So I googled for extending User. There is an idea that this should be done by creating something like this

class MyUser(models.Model):
    user = models.ForeignKey(User, unique=True)
    city = models.CharField(max_length=50, blank=True, default='')

This is fine but I have this serializer

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyUser
        fields = ('id', 'username', 'password', 'first_name', 'last_name', 'email', 'city')

So, the problem is that this serializer does some "magic" here. It tries to figure out what field should model have ... I want to have user with fields listed here, and these are fields are in User and 'city' is new custom field. Serializer doesn't get that it should look inside User model.

What am I missing here? How to tell this serializer that I want some fields inside User? I need to be able to crete user too.

解决方案

So apparently I don't have enough reputation to post a comment under an answer. But to elaborate on what Kevin Stone described, if you model is something like the following:

class AppUser(models.Model):
    user = models.OneToOneField(User)
    ban_status = models.BooleanField(default=False)

You can do something like this to create both the custom user and django user:

class AppUserSerializer(serializers.ModelSerializer):
    username = serializers.CharField(source='user.username')
    email = serializers.CharField(source='user.email')
    password = serializers.CharField(source='user.password')
    ban_status = serializers.Field(source='ban_status')

    class Meta:
        model = AppUser
        fields = ('id', 'username', 'email', 'password', 'ban_status')

    def restore_object(self, attrs, instance=None):
        """
        Given a dictionary of deserialized field values, either update
        an existing model instance, or create a new model instance.
        """
        if instance is not None:
            instance.user.email = attrs.get('user.email', instance.user.email)
            instance.ban_status = attrs.get('ban_status', instance.ban_status)
            instance.user.password = attrs.get('user.password', instance.user.password)
            return instance

        user = User.objects.create_user(username=attrs.get('user.username'), email= attrs.get('user.email'), password=attrs.get('user.password'))
        return AppUser(user=user)

这篇关于Django REST框架创建自定义用户的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆