Django REST框架创建自定义用户

Boj*_*vic 18 python django django-models django-rest-framework

我是Django领域的新手,但看到那里有很多"神奇".我正在使用Django REST Framework并创建允许免费用户注册的应用程序.我的用户需要一些Django用户不具备的其他字段.所以我用Google搜索扩展用户.有一种想法应该通过创建这样的东西来完成

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

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

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

所以,问题是这个序列化器在这里做了一些"魔术".它试图找出应该建模的字段...我想让用户在这里列出字段,这些字段在User中,'city'是新的自定义字段.Serializer没有得到应该在用户模型中查看.

我在这里错过了什么?如何告诉这个序列化器我想要用户内的一些字段?我也需要能够创建用户.

Ant*_*n K 18

显然,我没有足够的声誉在答案下发表评论.但是要详细说明凯文斯通所描述的内容,如果你的模型如下:

class AppUser(models.Model):
    user = models.OneToOneField(User)
    ban_status = models.BooleanField(default=False)
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,restore_object()与DRF 3.x不兼容,因此您需要使用create()和update()方法.示例:http://www.django-rest-framework.org/topics/3.0-announcement/#serializers. (5认同)

Kev*_*one 13

好的,有几件事.您想OneToOneField为您的用户模型扩展创建一个.

class MyUser(models.Model):
    user = models.OneToOneField(User)
    city = models.CharField(max_length=50, blank=True, default='')
Run Code Online (Sandbox Code Playgroud)

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

class UserSerializer(serializers.ModelSerializer):
    city = serializers.CharField(source='myuser.city')
    class Meta:
        model = User
        fields = ('id', 'username', 'password', 'first_name', 'last_name', 'email', 'city')
Run Code Online (Sandbox Code Playgroud)

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

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


mar*_*dev 1

如果您使用 django 1.5 或更高版本,请改用自定义用户模型,这样用户模型将拥有自己的专用表,并且序列化程序将正确拾取字段。