2016-09-10 61 views
1

settings.pyDRF(django-rest-framework)和TokenAuthentication,如何基于Token自动填充json字段?

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。 当我为Android应用程序使用这个RESTful api时,我了解到我登录并从RESTful api获取Token,然后使用Token通过Header将数据发布到RESTful api。

由于邮递员捕获,

enter image description here

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

如果我做了作者字段为空,它返回

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

  2. 如何获得json响应"author":"some alphabet name readable"而不是"author":"1 or 2 like number"作为捕获。我想要形式如"author":"stackoverflowman"

回答

2

你的第一个问题,你应该在PostViewSet添加此功能:

def perform_create(self, serializer): 
    serializer.save(author=self.request.user) 

关于第二个问题,你应该叫UserSerializerPostSerializer

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') 
+0

谢谢,对不起,还有一个问题,正如你的答案,它返回'“作者”:{ “ID”:1, “用户名”: “ghdalsrn”, “电子邮件”: “”, “related_postwriter”: 1, 2,]'它工作得很好,但是当我想返回只是一个领域,是,“用户名”字段,我该怎么办? –

+0

检查编辑@ H.fate – arcegk

+0

谢谢你的不错的答案。 –

相关问题