android - DRF(django-rest-framework)和TokenAuthentication,如何根据Token自动填充json字段?

标签 android django django-rest-framework token

settings.py

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.AllowAny',
    ),
}

序列化器.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。 当我在Android应用程序中使用这个RESTful api时,我了解到我登录并从RESTful api获取 token ,然后使用该 token 通过 header 将数据发布到RESTful api。

作为 postman 捕获,

enter image description here

我必须在正文中填写“作者”:“编号”。我认为这个数字意味着用户在我的 RESTful api 上的注册订单。从上面的截图来看,该作者是我的 RESTful api 的第一个用户。

如果我将作者字段设为空,它会返回

{
  "author": [
    "This field is required."
  ]
}
  1. 如何使用 token (或不使用 token 的其他方式)自动填写“作者”部分?

  2. 我怎样才能得到json响应“author”:“一些字母名称可读”,而不是“author”:“1或2像数字”作为捕获。我想要像 "author":"stackoverflowman" 这样的形式。

最佳答案

对于你的第一个问题,你应该在 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')

编辑

如果你只想要一个字段,你可以使用 source 声明一个字段:

class PostSerializer(serializers.ModelSerializer):
    author = serializers.ReadOnlyField(source='author.username')

    class Meta:
        model = Post
        fields = ('id', 'created_date', 'author', 'text', 'image')

关于android - DRF(django-rest-framework)和TokenAuthentication,如何根据Token自动填充json字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39425303/

相关文章:

android - 我无法使用 TouchImageView 依赖项

java - 宽度和高度为 match_parent 的 Recyclerview 返回固定大小错误

python - 从权限类访问 hyperlinkedRelatedField 对象

django - 是否可以选择性地抑制 Django 中的 post_save (或其他)信号?

python - Django Rest-auth 身份验证仅适用于 super 用户。在其他情况下,我得到 - 无法使用提供的凭据登录

android - 如何在 Android 中使用 Intent 连接到已知的 WiFI?

android - 唯一标识 ActionBar 选项菜单项

python - 我可以将我的客户模型与 Django 用户模型链接起来吗?

python - 将 django View 转换为 django Rest Framework APIView

python - Django 休息框架 : Pagination w/ListModelMixin