2016-09-10 9 views
1

settings.pyDRF(django-rest-framework)とTokenAuthenticationでは、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

jsonリクエストとjsonレスポンスのために、このRESTful APIを作成する必要がありました。 このRESTful APIをAndroidアプリケーションに使用すると、ログインしてRESTful APIからトークンを取得し、そのトークンを使用してデータを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でこの機能を追加する必要があります:あなたの2番目の質問のために

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

EDITを

あなたが唯一のフィールドをしたい場合は、あなたがソースでフィールドを宣言することができます、1 :{ 「ID」:1つの以上の質問には申し訳ありません

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

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

おかげで、あなたの答えとして、それは '「author」を返します。 "ユーザー名": "ghdalsrn"、 "電子メール": ""、 "related_postwriter":[ 1、 2、] 'それは非常にうまく動作しますが、私はただ一つのフィールドを返すことにしたい場合は、[はい、 '' username ''フィールド、どうすればいいですか? –

+0

編集を確認してください。@ H.fate – arcegk

+0

素敵な答えをありがとうございます。 –

関連する問題