DRF(django-rest-framework)和TokenAuthentication,如何根据Token自动填充json字段?
DRF(django-rest-framework) and TokenAuthentication, how to fill json field automatically based Token?
settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.AllowAny',
),
}
serializers.py
class UserSerializer(serializers.ModelSerializer):
related_postwriter = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
class Meta:
model = User
fields = ('id', 'username', 'email', 'related_postwriter')
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ('id', 'created_date', 'author', 'text', 'image')
def create(self, validated_data):
validated_data['author'] = self.context['request'].user
return super(PostSerializer, self).create(validated_data)
models.py
class Post(models.Model):
author = models.ForeignKey(User, related_name='related_postwriter')
text = models.TextField(blank = False)
image = models.ImageField(null = False, blank = False, upload_to='images')
created_date = models.DateTimeField(
default=timezone.now
)
def __str__(self): # __unicode__ on Python 2
return self.text
views.py
class PostViewSet(viewsets.ModelViewSet):
serializer_class = PostSerializer
permission_classes = [IsAuthenticated]
queryset = Post.objects.all()
我必须为 json 请求和 json 响应创建 RESTful api。
当我将此 RESTful api 用于 Android 应用程序时,我了解到我登录并从 RESTful api 获取令牌,然后该令牌用于 post 数据到 RESTful api 通过 Header.
作为post男子捕获,
我必须在 Body 上填写 "author":"number"。我认为这个数字意味着用户在我的 RESTful api 上的注册订单。从上面的捕获中,该作者是我的 RESTful api 的第一个用户。
如果我将作者字段设为空,它会返回
{
"author": [
"This field is required."
]
}
如何使用 Token(或其他不使用 Token 的方式)自动填充 "author" 部分?
如何获得 json 响应 "author":"some alphabet name readable"
,而不是 "author":"1 or 2 like number"
作为捕获。我想要像 "author":"Whosebugman"
这样的形式。
对于你的第一个问题,你应该在PostViewSet
中添加这个函数:
def perform_create(self, serializer):
serializer.save(author=self.request.user)
对于你的第二个问题,你应该从 PostSerializer
调用 UserSerializer
:
class PostSerializer(serializers.ModelSerializer):
author = UserSerializer(read_only=True)
class Meta:
model = Post
fields = ('id', 'created_date', 'author', 'text', 'image')
编辑
如果你只想要一个字段,你可以声明一个字段来源:
class PostSerializer(serializers.ModelSerializer):
author = serializers.ReadOnlyField(source='author.username')
class Meta:
model = Post
fields = ('id', 'created_date', 'author', 'text', 'image')
settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.AllowAny',
),
}
serializers.py
class UserSerializer(serializers.ModelSerializer):
related_postwriter = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
class Meta:
model = User
fields = ('id', 'username', 'email', 'related_postwriter')
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ('id', 'created_date', 'author', 'text', 'image')
def create(self, validated_data):
validated_data['author'] = self.context['request'].user
return super(PostSerializer, self).create(validated_data)
models.py
class Post(models.Model):
author = models.ForeignKey(User, related_name='related_postwriter')
text = models.TextField(blank = False)
image = models.ImageField(null = False, blank = False, upload_to='images')
created_date = models.DateTimeField(
default=timezone.now
)
def __str__(self): # __unicode__ on Python 2
return self.text
views.py
class PostViewSet(viewsets.ModelViewSet):
serializer_class = PostSerializer
permission_classes = [IsAuthenticated]
queryset = Post.objects.all()
我必须为 json 请求和 json 响应创建 RESTful api。 当我将此 RESTful api 用于 Android 应用程序时,我了解到我登录并从 RESTful api 获取令牌,然后该令牌用于 post 数据到 RESTful api 通过 Header.
作为post男子捕获,
我必须在 Body 上填写 "author":"number"。我认为这个数字意味着用户在我的 RESTful api 上的注册订单。从上面的捕获中,该作者是我的 RESTful api 的第一个用户。
如果我将作者字段设为空,它会返回
{
"author": [
"This field is required."
]
}
如何使用 Token(或其他不使用 Token 的方式)自动填充 "author" 部分?
如何获得 json 响应
"author":"some alphabet name readable"
,而不是"author":"1 or 2 like number"
作为捕获。我想要像"author":"Whosebugman"
这样的形式。
对于你的第一个问题,你应该在PostViewSet
中添加这个函数:
def perform_create(self, serializer):
serializer.save(author=self.request.user)
对于你的第二个问题,你应该从 PostSerializer
调用 UserSerializer
:
class PostSerializer(serializers.ModelSerializer):
author = UserSerializer(read_only=True)
class Meta:
model = Post
fields = ('id', 'created_date', 'author', 'text', 'image')
编辑
如果你只想要一个字段,你可以声明一个字段来源:
class PostSerializer(serializers.ModelSerializer):
author = serializers.ReadOnlyField(source='author.username')
class Meta:
model = Post
fields = ('id', 'created_date', 'author', 'text', 'image')