2016-05-05 5 views
0

私は独自のAPIを設定し、POSTメソッドを正常に動作させるのに問題があるため、Django rest frameworkを使用しています。私がしたいことがある新しいチームを作成することです、だから、基本的にDjango Rest Framework - リストが空でない場合は、POSTリクエストで「このリストは空ではありませんか?

[{"id":3,"name":"newTeam","members":["mem1", "mem2"],"services_used":["service1"]}] 

:ようにフォーマットJSONファイルexampleteam.jsonと私のAPIをヒットする

curl --form "[email protected]" 127.0.0.1:8000/teams/ > error.html 

:私は、curlコマンドを使用しますメンバmem1とmem2を使用し、サービス1を使用します。newTeam、mem1、mem2、およびservice1はすべて自分のデータベースに既に存在します。

私が戻ってきたのは、私のリストに情報がなく、私がこれまで要求したことが反映されていないという奇妙なhtmlです。これはerror.htmlにパイプされたものである。

{"members":["This list may not be empty."],"services_used":["This list may not be empty."]} 

これは私には奇妙で、メンバーリストが明らかに空ではないではありませんし、どちらも私の要求でservices_usedリストです。エラーがPOSTメソッドを定義した場所か、モデルに問題があると私は合理的に確信しています。以下は両方のファイルです。

views.py

@api_view(['GET', 'POST']) 
def team_list(request): 
    if request.method == 'GET': 
     teams = Team.objects.all() 
     serializer = TeamSerializer(teams, many=True) 
     return JSONResponse(serializer.data) 

    elif request.method == 'POST': 
     serializer = TeamSerializer(data=request.data) 
     if serializer.is_valid(): 
      serializer.save() 
      return Response(serializer.data, status=status.HTTP_201_CREATED) 
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

とmodels.py

class Team(models.Model): 
    name = models.CharField(max_length=32, default="") 
    members = models.ManyToManyField('Member') 
    services_used = models.ManyToManyField('Service') 

    def __str__(self): 
     return str(self.name) 

class Member(models.Model): 
    name = models.CharField(max_length=32, default="") 
    services_used = models.ManyToManyField('Service') 

    def __str__(self): 
     return str(self.name) 

class Service(models.Model): 
    name = models.CharField(max_length=64, default="") 

    def __str__(self): 
     return(self.name) 

とTeamSerializerクラスから関連するモデル:

class TeamSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Team 
     fields = ('id', 'name', 'members','services_used') 

POSTリクエストは、データベースを更新していないのはなぜ正しく?

あなたが(すでに既存のオブジェクトのPK)整数のリストでなければなりません

... 
elif request.method == 'POST': 
    serializer = TeamSerializer(data=request.data, many=True) 

第二の事、メンバーやサービスの多くのパラメータを指定してシリアライザをインスタンス化するオブジェクトのリストを作成したい場合は

+0

ことができます。また、広告d TeamSerializerクラス? –

+0

@MujGabrielがTeamSerializerクラスを追加しました。コメントありがとうございました – Ragnyll

答えて

2

最初のものではなく、文字列。

"members":[1, 2],"services_used":[1] 

あなたはペイロードとして代わりにJSONのファイルを送信する場合、あなたはそれを動作させるためにこのトリックを行う必要があります:

import json 

... 
elif request.method == 'POST': 
    # 'fileupload' is id specified in curl argument 
    data = json.loads(request.data['fileupload'].read()) 
    serializer = TeamSerializer(data=data, many=True) 
+0

リクエストメソッドを変更し、あなたが指定したとおりにjsonを送信しましたが、今度は[]がerror.htmlにパイプされ、データベースはまだ更新されません。 – Ragnyll

+0

@Ragnyllあなたはカールを正しく使用していますか?私は本当にcurlコマンドを使用して専門家ではないが、あなたはjsonの代わりにファイルを送信している。これを試してください: 'curl -H" Content-Type:application/json "-X POST -d '[{" id ":3、" name ":" newTeam "、" members ":[1,2]、" services_used ":[1]}] '127.0.0.1:8000/teams/>エラーです。html' –

+0

あなたはカールフラグの使用について正しいです。私は正しくfileuploadのために使用していると思ったが、私はそうは思わない。ありがとうございました! – Ragnyll

0

MUJガブリエルさんによって指定されますがインスタンスで作業していない場合あなたは(クラスが本当に意味を成さないかもしれませんが、それは単なる例示の目的のためです)例えば、many=Trueオプションを使用して、クラスのシリアライザでシリアライザを指定することができます答え:

class BookSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Book 


class ChapterSerializer(serializers.ModelSerializer): 
    books = BookSerializer(many=True) # Allows us to create chapters without specifying book(s) straight away 

    class Meta: 
     model = Chapter 
関連する問題