【问题标题】:DRF(django-rest-framework) and TokenAuthentication, how to fill json field automatically based Token?DRF(django-rest-framework)和TokenAuthentication,如何根据Token自动填充json字段?
【发布时间】:2016-09-10 10:53:33
【问题描述】:

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 获取 Token,然后该 Token 用于通过 Header 将数据发布到 RESTful api。

作为邮递员捕获,

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

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

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

  2. 如何获取 json 响应 "author":"some alphabet name readable",而不是 "author":"1 or 2 like number" 作为捕获。我想要像"author":"stackoverflowman" 这样的表格。

【问题讨论】:

    标签: android django django-rest-framework token


    【解决方案1】:

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

    【讨论】:

    • 谢谢,抱歉再问一个问题,作为您的答案,它返回"author": { "id": 1, "username": "ghdalsrn", "email": "", "related_postwriter": [ 1, 2, 3 ] 它工作得很好,但是当我只想返回一个字段时,是的,"username" 字段,应该我愿意吗?
    猜你喜欢
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    相关资源
    最近更新 更多