2016-11-21 23 views
0

私は2つのモデルを持っています。著者は彼の記事を表現しています。作者は記事を自由に追加できます(問題は問題ありませんが、問題)。次のように Django Rest Framework - 外部キーデータを持つオブジェクトをパスパラメータに追加します

class Author(models.Model): 
    name = ... 


class Article(models.Model): 
    author = models.ForeignKey(Author, related_name='articles', on_delete=models.CASCADE) 
    title = ... 
    content = ... 
    timestamp = models.DateTimeField(auto_now=True) 

私のシリアライズ

は以下のとおりです。

class AuthorSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Author 
     fields = '__all__' 

class ArticleSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Article 
     fields = '__all__' 

そして、私は単純なビューがありますので、簡単な

url(r'^authors/(?P<author_id>[0-9]+)/articles/$', views.author_articles) 

@csrf_exempt 
def author_articles(request, author_id): 
    try: 
     author = Author.objects.get(id=author_id) 
    except Author.DoesNotExist: 
     return HttpResponse(status=404) 

    if request.method == 'GET': 
     articles = author.articles.all() 
     serializer = serializers.ArticlesSerializer(articles, many=True) 
     return JsonResponse(serializer.data, safe=False) 
    elif request.method == 'POST': 
     data = JSONParser().parse(request) 
     serializer = serializers.ArticlesSerializer(data=data) 
     if serializer.is_valid(): 
      serializer.save() 
      return JsonResponse(serializer.data, status=201) 
     return JsonResponse(serializer.errors, status=400) 

URLが定義されていますURLへのPOSTリクエスト:server:port/authors/1/articles/下の体は魅力的に機能します!私は一度体内に一度パスのparamsに、私は二回著者IDを提供することをある何のバグ

{ 
    "author": 1, 
    "title": "foo", 
    "content": "bar" 
} 

。パスのパラメータから簡単に削除して機能させることができますが、本当に欲しいのはその逆です。私は身体をイドなしで、イドをパスパラムから推測したい。

多くの方法で試してみましたが、繰り返し失敗しました。助けていただければ幸いです。

私はPostgresにDjangoとDjango-Rest-Frameworkを使用しています。

ありがとうございました。

答えて

1

あなたはシリアライザsave()方法にauthor_idを渡すことができます。

elif request.method == 'POST': 
    data = JSONParser().parse(request) 
    serializer = serializers.ArticlesSerializer(data=data) 
    if serializer.is_valid(): 
     serializer.save(author=author.id) 

一つアドバイス、Djangoの残りのフレームワークは、あなたが少なく、よりコードを書くことができます。あなたはそれが5-6

+0

私が質問を投稿する前に、自分自身を試してみました、最初のオプションに機能線を減らすことができますJsonResponseなど
使用APIViewクラスまたはapi_viewデコレータではなく、あるいはviewsetsを使用し、JSONParserと定期的なDjangoのビューを必要としませんそれは動作しません。しかし、セカンド - 魅力のような作品はありがとう!再デコレータとビューセット私はビューセットを使い始めましたが失敗しました。どのように動作しているのかを理解するための基礎から始めることにしました。 –

+0

@UriShalitあなたがそれを解決してうれしい、続ける:) –

関連する問題