Django 如何在模型序列化程序的创建方法中设置序列化程序自定义字段?
我用的是一个非常简单的模型,但我被困在这里了。我只想在创建一个用户后,给他发送一个令牌。我创建了一个custome序列化程序字段。 这是我的序列化程序类Django 如何在模型序列化程序的创建方法中设置序列化程序自定义字段?,django,django-rest-framework,serialization,Django,Django Rest Framework,Serialization,我用的是一个非常简单的模型,但我被困在这里了。我只想在创建一个用户后,给他发送一个令牌。我创建了一个custome序列化程序字段。 这是我的序列化程序类 class UserCreateSerializer(serializers.ModelSerializer): token = serializers.CharField(allow_blank=True, read_only=True) password = serializers.CharField(min_length=
class UserCreateSerializer(serializers.ModelSerializer):
token = serializers.CharField(allow_blank=True, read_only=True)
password = serializers.CharField(min_length=8, write_only=True)
class Meta:
model = get_user_model()
fields = ('id',
'username',
'password',
'token',
)
def create(self, validated_data):
uname = validated_data['username']
password = validated_data['password']
user = get_user_model().objects.create(
username=uname,
)
user.set_password(password)
user.save()
data = self.get_initial()
data['token'] = Token.objects.create(user=user)
return user
这是我的看法
class UserCreateAPIView(CreateAPIView):
serializer_class = UserCreateSerializer
permission_classes = [AllowAny]
每次我向它发布请求时,它都不会用令牌响应我,它总是在不使用令牌的情况下给出响应
{
"id": 41,
"username": "J.Son",
}
根据定义,它被定义为
更新
为什么从数据库()刷新?
在
create()
方法中,首先创建User
对象并分配给User
变量。此时,user.auth_token.key
将是None
,因为还没有创建token
。然后,您将创建一个与用户
对应的令牌
。但是,它不会反映在用户
变量上(那里没有自动刷新功能)。因此,user.auth\u token.key
仍将是None
。同样的用户
对象/实例在to_表示
方法中用于表示最终数据。这就是为什么最初它没有显示标记
refresh\u from_db()
,顾名思义,它从db刷新它的值,因此它得到了user.auth\u token.key
如果我打印(数据[“token”]),它显示在终端上,但没有响应,问题不在生成token中,我还创建了一个登录序列化程序,在那里我生成了tocken-in-Validate方法并将其保存到attrs['token']),它在那里工作正常,更新了答案。在create method中添加user.refresh\u from\u db()
是的,它起作用了,你能解释一下哪里出了问题,以及为什么要这样做“user.refresh\u from\u db()”
class Token(models.Model):
"""
The default authorization token model.
"""
key = models.CharField(_("Key"), max_length=40, primary_key=True)
user = models.OneToOneField(
settings.AUTH_USER_MODEL, related_name='auth_token',
on_delete=models.CASCADE, verbose_name=_("User")
)
created = models.DateTimeField(_("Created"), auto_now_add=True)
class UserCreateSerializer(serializers.ModelSerializer):
token = serializers.CharField(
allow_blank=True, read_only=True, source='auth_token.key')
# your code
def create(self, validated_data):
# your code
user.refresh_from_db()
return user