首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Django REST框架创建自定义用户

Django REST框架创建自定义用户
EN

Stack Overflow用户
提问于 2013-11-05 00:37:18
回答 5查看 17.9K关注 0票数 21

我是Django领域的新手,但我看到那里有很多“魔法”。我正在使用Django REST框架和创建的应用程序,将允许免费用户注册。我的用户需要一些在Django user中不可用的附加字段。所以我在谷歌上搜索了扩展用户。有一种想法是,这应该通过创建如下内容来实现

代码语言:javascript
复制
class MyUser(models.Model):
    user = models.ForeignKey(User, unique=True)
    city = models.CharField(max_length=50, blank=True, default='')

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

代码语言:javascript
复制
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyUser
        fields = ('id', 'username', 'password', 'first_name', 'last_name', 'email', 'city')

所以,问题是这个序列化程序在这里做了一些“魔术”。它试图找出模型应该有什么字段...我想有用户在这里列出的字段,这些字段是在用户和‘城市’是新的自定义字段。序列化程序没有得到它应该查看用户模型内部的信息。

这里我漏掉了什么?如何告诉这个序列化程序我想要一些字段在User中?我需要能够克里特用户也。

EN

回答 5

Stack Overflow用户

发布于 2014-10-29 11:24:30

所以很明显,我没有足够的名气在答案下面发表评论。但要详细说明凯文·斯通所描述的内容,如果您进行建模,则如下所示:

代码语言:javascript
复制
class AppUser(models.Model):
    user = models.OneToOneField(User)
    ban_status = models.BooleanField(default=False)

您可以像这样创建自定义用户和django用户:

代码语言:javascript
复制
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)
票数 20
EN

Stack Overflow用户

发布于 2013-11-06 16:01:51

好吧,有几件事。您希望为用户模型扩展创建一个OneToOneField

代码语言:javascript
复制
class MyUser(models.Model):
    user = models.OneToOneField(User)
    city = models.CharField(max_length=50, blank=True, default='')

现在,Django Rest Framework的强大之处在于,您可以构建序列化程序,在序列化时从这两个模型获取数据。

代码语言:javascript
复制
class UserSerializer(serializers.ModelSerializer):
    city = serializers.CharField(source='myuser.city')
    class Meta:
        model = User
        fields = ('id', 'username', 'password', 'first_name', 'last_name', 'email', 'city')

最后,在创建用户的位置,由于使用的是自定义字段,因此需要实现自己的restore_object(),以便从输入数据构建这两个模型。

此外,在Django中创建用户有点不同,您需要调用create_user()并提供一个经过哈希处理的密码,因此它不像存储序列化程序中的字段那么简单。

票数 16
EN

Stack Overflow用户

发布于 2017-01-12 23:24:49

如果这个用例更容易在文档中找到,那就更好了。正如@jamod指出的那样,在DRF3中,你可以找到它的here

代码语言:javascript
复制
class UserSerializer(serializers.ModelSerializer):
    profile = ProfileSerializer()

    class Meta:
        model = User
        fields = ('username', 'email', 'profile')

    def create(self, validated_data):
        profile_data = validated_data.pop('profile')
        user = User.objects.create(**validated_data)
        Profile.objects.create(user=user, **profile_data)
        return user
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19772457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档