Django REST框架创建自定义用户 [英] Django REST Framework Creating custom user
问题描述
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屋!