2017-10-20 5 views
0

私はDjango Rest FrameworkのポストのAPIリストを持っています。 私のポストタイトルをslugifyします。ユーザーが投稿にタイトルを付けるときはいつでも、プラグインオブジェクトが提供されていないときはpk(DRFのデフォルトルックアップフィールド)でポストAPIの詳細をキャプチャします。投稿にタイトルがある場合はスラッグフィールド。Django Rest Framework DetailPIViewのスラッグまたはpk参照フィールド

は、適用後の私のAPIフォルダで、私は次のviews.pyに書いた:

class PostDetailAPIView(generics.RetrieveAPIView): 
    queryset = Post.objects.all() 
    serializer_class = serializers.PostDetailSerializer 
    try: 
     lookup_field = 'slug' 
    except: 
     lookup_field = 'pk' 

を、対応するurls.pyを提供:

urlpatterns = [ 
    url(r'^$', PostListAPIView.as_view(), name='list-api'), 
    url(r'^(?P<slug>[\w-]+)/$', PostDetailAPIView.as_view(), 
     name='detail-api'), 
    url(r'^(?P<pk>\d+)/$', PostDetailAPIView.as_view(), name='detail- 
     api'), 
] 

ときポストこのアプローチは完璧に動作しますslugified(タイトル)ルックアップを持っています。しかし、無スラグとのポストのためのポストの詳細ビューには、次のことを示しています

HTTP 404 Not Found 
Allow: GET, HEAD, OPTIONS 
Content-Type: application/json 
Vary: Accept 

{ 
    "detail": "Not found." 
} 

PKまたはスラグフィールドのルックアップのどちらかにポストAPIの詳細を表示する方法上の任意の提案を?好ましくは、urls.pyにコード反復はありません。

答えて

1

最初に:あなたのurls.pyは、のURLにのURLで動作します。だから、あなたの2番目のURLを見つけることができません。

2番目:私の意見では、 "pk"バージョン(これはRESTの状態です)またはルックアップのスラッグバージョンに固執する必要があります。ですから、一般的に私はpkやスラッグを探すプロセスを予期しています。

これはまだ100%の回答を解決していませんが、何が起こっているのか、そしてRESTエンドポイントがどのように見えるかを見逃しているはずです。

+0

はい、私は多分何(スラッグを生成してユーザが自分の投稿のタイトルを提供するかどうか)にかかわらずスラッグを構築すべきだと考えていました。私は私のランダムなスラッグジェネレータ関数のロジックをやり直して、スラッグのためのルックアップフィールドを一回修正すると思います。歓声メイト。 –

+0

これはあなたを助けてくれてうれしいです。投稿のタイトルをユーザーの必要に応じて考慮する方法はありますか?私はあなたが何を構築しているのかは分かりませんが、これは私には合理的です。 – Chgad

+0

ちょっとChgad。私はinstagramのクローンをbuodingしています。 Instagramの投稿に必要なタイトルはありません。だから私は多分同じことをする必要があります。 –

0

1つのビューに2つの異なるパラメータを使用すると、私には悪い習慣のように思えます。私はそれらのうちの1つを使用することをお勧めします.pkは整数型とタイトルあなたはあなたのロジックを行うURLパラメータのタイプを確認することができます

+0

詳細を教えてください。あなたは私がすでに行ったことにsuggsetionが対応しているようです。ありがとうございました。 –

+0

あなたは2つのURLパターンを持っています。あなたはただ1つのURLパターンを使用し、URLのパラメータをチェックするためにビューにキャッチしようとお勧めします。 pkはint型で、slugは文字列になるからです。あなたは何が渡されたかを決定するために型を使うことができます。 –

関連する問題