2017-05-25 9 views
0

私はAPIを作成するために、ジャンゴとDjango残りのフレームワークを学んでいると私は、このコマンドを実行すると、なぜ周り私の頭をラップすることはできません。ジャンゴ休憩フレームワーク - Userフィールドはないかもしれませんヌル

http --json POST http://127.0.0.1:8000/api/v1/stocks/ book_code='Abook' 'Authorization: Token 123243434354353' 

私はエラーを取得しています言う:

HTTP/1.0 400 Bad Request 
Allow: GET, POST, HEAD, OPTIONS 
Content-Type: application/json 
Date: Thu, 25 May 2017 19:16:37 GMT 
Server: WSGIServer/0.2 CPython/3.6.0 
Vary: Accept 
X-Frame-Options: SAMEORIGIN { 
    "user": [ 
     "This field is required." 
    ]} 

「ユーザー」フィールドが必要とされているが、私はそれは私が認証されたユーザ、すなわち、提供してきたトークンに基づいてユーザーを取り込むことを期待しています。

これはbookstock/models.pyです:

from django.db import models 
from django.contrib.auth.models import User 

class Stock(models.Model): 
''' 
Model representing the stock info. 
''' 
user = models.ForeignKey(User) 
book_code = models.CharField(max_length=14, null=True, blank=True) 

def __str__(self): 
    return self.book_code 

これはapi/serializer.pyです:

from bookstock.models import Stock 
from rest_framework import serializers 

class StockSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Stock 
     fields = ('id', 'user', 'book_code') 

これはapi/views.pyです:

from rest_framework import generics 
from bookstock.models import Stock 
from api.serializers import StockSerializer 
from rest_framework.permissions import IsAuthenticated 

class StockList(generics.ListCreateAPIView): 
    serializer_class = StockSerializer 
    permission_classes = (IsAuthenticated,) 

    def get_queryset(self): 
     user = self.request.user 
     return Stock.objects.filter(user=user) 

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

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

これはapi/urls.pyです:

from django.conf.urls import url, include 
from api import views 
from rest_framework.authtoken.views import obtain_auth_token 

urlpatterns = [ 
    url(r'^v1/stocks/$', views.StockList.as_view()), 
    url(r'^v1/api-token-auth/', obtain_auth_token), 
    url(r'v1/api-auth/', include('rest_framework.urls', namespace='rest_framework')), 

] 

私には何が欠けていますか? SOからの回答に基づいて、perform_createperform_updateのオーバーライドでユーザー権利が設定されるはずですか?

答えて

0

perform_createメソッドはメソッドによって呼び出され、シリアライザの検証が行われます。この段階では、DRFが見つかり、行方不明のユーザフィールドフラグを立てています:https://github.com/encode/django-rest-framework/blob/master/rest_framework/mixins.py#L14

をその周りに複数の方法、すなわちread_only=Trueにシリアライザフィールドを設定したり、シリアライザにvalidate_userメソッドをオーバーライドがあります。 http://www.django-rest-framework.org/api-guide/validators/#currentuserdefault

user = serializers.HiddenField(default=serializers.CurrentUserDefault()) 

+0

おかげで多くのことを(CharFieldまたは何でもお好みでHiddenFieldを置き換える):

私が考える最もエレガントな方法は、DRFのcurrentuserdefaultバリデータを使用することです!それが問題を解決しました! – shaz

関連する問題