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)
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()并提供经过哈希处理的密码,因此它不像从序列化程序存储字段那么简单.