我是Django领域的新手,但我看到那里有很多“魔法”。我正在使用Django REST框架和创建的应用程序,将允许免费用户注册。我的用户需要一些在Django 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', 'city')
所以,问题是这个序列化程序在这里做了一些“魔术”。它试图找出模型应该有什么字段...我想有用户在这里列出的字段,这些字段是在用户和‘城市’是新的自定义字段。序列化程序没有得到它应该查看用户模型内部的信息。
这里我漏掉了什么?如何告诉这个序列化程序我想要一些字段在User中?我需要能够克里特用户也。
发布于 2014-10-29 11:24:30
所以很明显,我没有足够的名气在答案下面发表评论。但要详细说明凯文·斯通所描述的内容,如果您进行建模,则如下所示:
class AppUser(models.Model):
user = models.OneToOneField(User)
ban_status = models.BooleanField(default=False)
您可以像这样创建自定义用户和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)
发布于 2013-11-06 16:01:51
好吧,有几件事。您希望为用户模型扩展创建一个OneToOneField
。
class MyUser(models.Model):
user = models.OneToOneField(User)
city = models.CharField(max_length=50, blank=True, default='')
现在,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')
最后,在创建用户的位置,由于使用的是自定义字段,因此需要实现自己的restore_object()
,以便从输入数据构建这两个模型。
此外,在Django中创建用户有点不同,您需要调用create_user()
并提供一个经过哈希处理的密码,因此它不像存储序列化程序中的字段那么简单。
发布于 2017-01-12 23:24:49
如果这个用例更容易在文档中找到,那就更好了。正如@jamod指出的那样,在DRF3中,你可以找到它的here
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
https://stackoverflow.com/questions/19772457
复制相似问题