2016-08-17 7 views
4

、私は以下のクラスがあります。ジャンゴ休憩Frameworkで外部キー関係を投稿私の<strong>モデル</strong>で

class Topic(models.Model): 
    name = models.CharField(max_length=25, unique=True) 

class Content(models.Model): 
    title = models.CharField(max_length=255) 
    body = models.TextField() 
    topic = models.ForeignKey(Topic, blank=True, null=True) 

マイシリアライザはこのようなものです:

class TopicSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Topic 
     fields = ('name') 

class ContentSerializer(serializers.ModelSerializer): 
    topic = TopicSerializer(read_only=True) 
    class Meta: 
      model = Content 
      fields = ('title', 'body', 'topic') 

よし、でように私のURLファイル、私は次のパターンがあります:

urlpatterns = [ 
    ... 
    url(r'^api/topic_detail/(?P<name>[a-zA-Z0-9-]+)/content_list/$', views.topic_content_list, name='topic_content_list'), 
    ... 
] 

したがって、ユーザーが/api/topic_detail/sports/content_list/と言うと、スポーツのトピックを持つすべてのコンテンツのリストが表示されます。ここで私が望むのは、POST上記のURLに次のデータがあると、自動的にスポーツに関連するトピックフィールドを持つコンテンツオブジェクトが作成されます。

私は私のビューにこの次のようにやろうとしています:

{ 
    "title": "My blog post", 
    "body" : ".....", 
} 

コンテンツ・オブジェクトが作成されます:

@api_view(['GET', 'POST']) 
def topic_content_list(request, name): 
    try: 
     topic = Topic.objects.get(name=name) 
    except: 
     return Response(status=status.HTTP_404_NOT_FOUND) 

    if request.method == 'GET': 
     contents = Content.objects.filter(topic=topic) 
     serializer = ContentSerializer(contents, many=True) 
     return Response(serializer.data) 

    elif request.method == 'POST': 
     request.data["topic"] = topic 
     serializer = ContentSerializer(data=request.data) 
     print 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) 

は今、この私がURL /api/topic_detail/sports/content_list/とPOST行くと言うことができますタイトルと本文フィールドが正しく設定されています。ただし、topicフィールドはnullに設定されています。これをどうすれば解決できますか?どんな助けもありがとうございます。

また、私は非常に多くのことが自動的に起こることに不快であるので、一般的なビューセットを使用することを提案しないでください。

さてさて、私は私のダムのミス固定

EDIT:

ある
class ContentSerializer(serializers.ModelSerializer): 
    topic = TopicSerializer(read_only=False) 
    class Meta: 
      model = Content 
      fields = ('title', 'body', 'topic') 

は、私がFalseにREAD_ONLY引数を設定します。しかし、今のポストは新しいエラーを作成します。

{ 
    "topic": { 
     "non_field_errors": [ 
      "Invalid data. Expected a dictionary, but got Topic." 
     ] 
    } 
} 

私はかなり確信しているこれは、私が送信していdata.websiteはJSONではなく、ただDjangoのモデルインスタンスという事実を意味します。どのようにして単一のインスタンスをJSON化できますか?

答えて

4

これはシリアライザのものです。

 topic = TopicSerializer(read_only=True) 

トピックが読み取り専用であるため、シリアライザを保存しようとしているときにトピックが保存されません。それを取り除くと問題が解決されます。

EDIT:それは辞書を期待しているし、あなたがモデルのインスタンスを渡しているので、

今すぐ2番目のエラーごとに、それがあるので、あなたは、2つのオプションがあります。手書きで作成してください。

topic_dict = { "name": topic.name }

とリクエストで 'トピック' としてそれを渡します。データを保存したり、保存したり、topic_idを与えたりすると、外部キー関係が存在するため、動作するはずです。

だから、のようになります。

request.data["topic_id"] = topic.id 

は、今あなたがする何を選ぶかは全くあなた件までです。

+0

ありがとうございます。編集を追加しました。お手伝いできますか? –

+0

Nvm、私は問題が別のものであるので別の質問をするべきです。 –

+0

私の答えを更新しました。 –

関連する問題