Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何在模型序列化程序的创建方法中设置序列化程序自定义字段?_Django_Django Rest Framework_Serialization - Fatal编程技术网

Django 如何在模型序列化程序的创建方法中设置序列化程序自定义字段?

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=

我用的是一个非常简单的模型,但我被困在这里了。我只想在创建一个用户后,给他发送一个令牌。我创建了一个custome序列化程序字段。 这是我的序列化程序类

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