2013-04-08 5 views
8

私はDjango RESTフレームワークを使用してWebアプリケーションのAPIを作成しています。私はをMetaクラスに設定したクラス 'Comment'を持っています。これはGETCommentsを入力するとうまくいきます。 POSTまたはPUTリクエストを送信しようとすると(つまり、新しいCommentを作成します)、私はForeignKey IDの代わりにオブジェクトを含める必要があると言われます。ここでDjango RESTフレームワークのPOST/PUTの深さが異なる?

は私のシリアライザクラスです:

class CommentSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Comment 
     depth = 2 

モデル:

class Comment(models.Model): 
    user = models.ForeignKey(User, null=True, blank=True, 
     related_name='comments') 
    budget = models.ForeignKey(Budget, related_name='comments') 
    published = models.BooleanField(default=False) 
    body = models.TextField() 
    created = models.DateTimeField(auto_now_add=True) 

ビューコード:

class Comments(generics.ListCreateAPIView): 

    model = Comment 
    serializer_class = CommentSerializer 

    def pre_save(self, obj): 
     obj.user = self.request.user 

と出力(JSON)で表示されるエラーがされ:

{"user": ["This field is required."], "budget": [{"non_field_errors": ["Invalid data"]}]} 

この生データが送信されます。

{"budget": 2, "published": true, "body": "Another comment"} 
+0

{{"budget_id":2} 'または{{" budget ":{" id ":2}}'を送信するとどうなりますか? –

+0

RE @Nathan Villaescusa。他の予算項目が必要に応じて表示されます。 – panchicore

答えて

6

私は、外部キー関係を指しシリアライザフィールドを定義するための適切な方法がserializers.PrimaryKeyRelatedFieldのようなものを通じてであると考えています。モデルシリアライザがシリアライザクラスで明示的に定義することなく、このフィールドクラスを自動的に使用するとは思わない。

http://www.django-rest-framework.org/api-guide/relations/#primarykeyrelatedfield

私はPrimaryKeyRelatedFieldシリアライザが正しく、あなたの例で使用されているようなJSONデータの送信を扱うだろうと想像します。

+6

ここからGoogleに到着した方々のために、Tom Christie(DRFの作成者)がこれについて詳しく書きました:https://groups.google.com/d/msg/django-rest-framework/vCl2I_EzJnE/qwRdIdxiUe4J –

6

私はこれは少し遅れている知っているが、そのように私は2つのシリアライザを使用して終了:

class CommentReadSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Comment 
     depth = 2 

class CommentWriteSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Comment 

は次に、このように使用:

class Comments(generics.ListCreateAPIView): 

    model = Comment 
    serializer_class = CommentReadSerializer 

    def create(self, request, *args, **kwargs): 
     serializer = CommentWriteSerializer(data=request.DATA, files=request.FILES) 
     if serializer.is_valid(): 
      self.pre_save(serializer.object) 
      self.object = serializer.save(force_insert=True) 
      self.post_save(self.object, created=True) 
      headers = self.get_success_headers(serializer.data) 
      serializer = CommentReadSerializer(serializer.object) 
      return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) 

     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 
1

あなたはget_serializer_class()をオーバーライドすることによって異なるシリアライザを設定することができます関数のように:

def get_serializer_class(self): method = self.request.method if method == 'PUT' or method == 'POST': return YourWriteSerializer else: return YourReadSerializer

私はしばらくしてからグーグルでここに来たので、私はこれを追加すると思った。

関連する問題