2017-05-27 14 views
0

私はうまくいくはずですが、数時間後には私は迷っています。私はDjangoとDRFを学んでいるので、すべてが闘争のようです。Django Rest Framework - ListCreateAPIViewの使用時にPOSTする方法

私はDjango Rest Frameworkを使用してAPIを作成しました。私は(私はSTOCK serializerにプッシュすることができます)でPUSH要求ではなく、GET要求を実行することができます。私が知っている

HTTP/1.0 400 Bad Request 
Allow: GET, POST, HEAD, OPTIONS 
Content-Type: application/json 
Date: Sat, 27 May 2017 14:51:52 GMT 
Server: WSGIServer/0.2 CPython/3.6.0 
Vary: Accept 
X-Frame-Options: SAMEORIGIN 

{ 
    "stock": [ 
     "This field is required." 
    ] 
} 

:私は次のエラーを取得する

http POST http://127.0.0.1:8000/api/v1/notes/ note='api test' {"stock":"test"} 'Authorization: Token 1235454545656' 

:私は、次のコマンドを使用してPOSTしようとすると、私は(Djangoの休憩フレームワークのウェブサイトからの命令を使用して)書かれているコードに基づいて、それは必須です...それがPUSHリクエストに含まれている理由です!誰かが私が間違ってやっていることを説明し、それを修正する方法はありますか?

これは私のbook/models.py次のとおりです。

from django.db import models 
from django.utils import timezone 
from django.contrib.auth.models import User 
import uuid 

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 

class Note(models.Model): 
    ''' 
    Model representing the stock note. 
    ''' 
    user = models.ForeignKey(User) 
    note = models.TextField(max_length=560) 
    stock = models.ForeignKey(Stock) 
    date_note_created = models.DateTimeField(default=timezone.now) 

    def __str__(self): 
     return self.note 

これは私のapi/serializer.pyです:

from bookstock.models import Stock, Note 
from rest_framework import serializers 

class StockSerializer(serializers.ModelSerializer): 

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

class NoteSerializer(serializers.ModelSerializer): 
    stock = StockSerializer(many=True) 
    user = serializers.HiddenField(default=serializers.CurrentUserDefault()) 


    class Meta: 
     model = Note 
     fields = ('user', 'note', 'stock', 'date_note_created') 

これは私のapi/views.pyです:

from rest_framework import generics 
from bookstock.models import Stock, Note 
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) 

class NoteList(generics.ListCreateAPIView): 
    serializer_class = NoteSerializer 
    permission_classes = (IsAuthenticated,) 

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

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

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

これは私の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/notes/$', views.NoteList.as_view()), 
    url(r'^v1/api-token-auth/', obtain_auth_token), 
    url(r'v1/api-auth/', include('rest_framework.urls', namespace='rest_framework')), 

] 

どうしたのですか?

+0

ストックは在庫のリストでなければなりません...あなたはシリアライザでmany = Trueを追加して以来、シリアライザはその在庫をdictsのリストにすることを期待しています。 – zaidfazil

+0

Hi Fazil、ありがとう私はmain = Trueを削除しても、同じエラーが表示されます。 HTTP POSTをリスト 'http POST http://127.0.0に変更する場合。{ "株":[ "タイプが正しくありません:1:8000/api/v1/notes/note = 'api test'株価= [" test "] 'Authorization:Token 1235454545656''予想されたpk値、strを受け取りました。 " ] } '。その他の提案はありますか? – shaz

+0

シリアライザのストックフィールドを実際に通過する必要があるデータは何ですか? book_codeまたはuserですか? – zaidfazil

答えて

0

私は基本に戻ってDRFで再開しました。まず、トークン認証を無効にし、テストのために基本認証を使用しました。次に、cURL/HTTPieの代わりにBrowsable APIを使用してプッシュしようとしました。私は、Browsable APIを使ってPUSHすることができなかったことを知りました。

これは、問題がcURL/HTTPieの構文ではなく、最終的にBrowsable APIの問題に関して別のquestionを投稿したことを伝えました。解決したら、私はBrowsable APIとcURL/HTTPieでPOST/PUT/DELETEすることができました。ユーザーがオブジェクトの所有者でない場合には、PUSHingに関する別の問題がありました。これはhereです。

要するに、この問題は2つの他の質問/回答の結果として解決されました。

0

あなたはNoteSerializerを介してデータをポストする必要がある場合は、あなたのデータがありません。この形式の場合シリアライザは、エラーが発生します

{ 
    "user": "some_user", 
    "note": "some_note", 
    "date_created": "28-05-2017", #some_date 
    "stock": [ 
       { 
        "id": "2", #some_id 
        "user": "some_user", 
        "book_code": "some_book_code" 
       }, 
       { 
        "id": "3", #some_id 
        "user": "some_user", 
        "book_code": "some_book_code" 
       } 
      ] 
} 

、この形式である必要があります。シリアライザの各フィールドについて、必須= Trueがdjangoによってデフォルトとして設定されます。

また、Stockシリアライザからフィールドを削除する必要はありません。

+0

ありがとうFazil。構文的には、HTTPIEまたはCURLを使用しても、構文はどのようになりますか?参照するノートが必要なデータベースに 'Test'という名前の在庫' book_code'があるとします。あなたがそれを記述した方法と、モデルとビューに基づいて、モデル/ビュー、 'user'、' date_created'、 'id'の3つのフィールドに値が入ると思います。だから私が提供する必要があるのは、 'note'と'株価 'をメモしたいということです(この場合は' Test')。 – shaz

関連する問題