2017-06-25 4 views
1

djangoでviewparamsを作成し、クエリparamsでurlを取得し、クエリparamsをフィルタリングしたいとします。ドキュメントに関する私の最大の問題は、それらを馬鹿にするものではないということです。以下のURLで動作しますDjangoの残りのフレームワークのドキュメントdjangofilterbackendクエリパラメータと入力されていないクエリパラメータオプション

class ProductList(generics.ListAPIView): 
queryset = Product.objects.all() 
serializer_class = ProductSerializer 
filter_backends = (filters.DjangoFilterBackend,) 
filter_fields = ('category', 'in_stock') 

http://www.django-rest-framework.org/api-guide/filtering/からこの例を見てみましょう:

http://example.com/api/products?category=clothing&in_stock=True

しかし、私は例えば設定されたカテゴリのオプションを使用せずにURLを持っている場合。このコードは壊れますか?それとも、クエリのパラメータフィルタに値が設定されていないかを知り、それを無視するのに十分なのですか? OK罰金、それはそのdjangofilterbackendライブラリを意味しているのは、フィルタがguarnteedされているユースケースのための唯一の良いです

ass PurchaseList(generics.ListAPIView): 
serializer_class = PurchaseSerializer 

def get_queryset(self): 
    """ 
    Optionally restricts the returned purchases to a given user, 
    by filtering against a `username` query parameter in the URL. 
    """ 
    queryset = Purchase.objects.all() 
    username = self.request.query_params.get('username', None) 
    if username is not None: 
     queryset = queryset.filter(purchaser__username=username) 
    return queryset 

:それはそれからではない場合

私は、このようなフィルタを作成する必要が想像します?もし誰かが私に例を教えてくれないのであれば、ドキュメントは私のような馬鹿な気がしません。

ありがとう

答えて

0

Djangoのフィルタは、フィルタリングと検索が非常に簡単になり、非常に強力なライブラリです。あなたが提供した例は、django filter docsからのもので、viewetsのフィルタの使い方を明確に説明しています。質問のポイントとして

は、フィルタは、このURLがcategory-衣類や株式真でろ過した製品のリストを与える

http://example.com/api/products?category=clothing&in_stock=True

に明確に動作します。あなたは

http://example.com/api/products/

ようfilter_fieldsで指定されたクエリのparamsを提供しない場合でも、その後、これは任意のフィルタリングを適用せずに製品のリストを与える

は、したがって、でクエリのparamsを提供する必要はありませんフィルタリングを適用する必要がない場合はURL。

そうなURL:

http://example.com/api/products?category=&in_stock= 

and 

http://example.com/api/products/ 

の両方が同じ結果を与えます。

フィルタは1つだけ適用する必要がある場合にも機能します。 だから

http://example.com/api/products?category=clothing 

and 

http://example.com/api/products?category=clothing&in_stock= 

両方を最後に、カスタムクエリセットが

def my_new_queryset(self): 
    queryset = self.filter_queryset(self.get_queryset()) 
    // customize queryset 
    ... 

それとも、単にfilter_querysetメソッドをオーバーライドするようにクエリセットをカスタマイズする前に、フィルタパラメータを適用し、ビルドすることができ、同じ結果に

を与えるのURLジェネリックフィルタリングのために。 http://www.django-rest-framework.org/api-guide/filtering/#custom-generic-filtering

+0

あなたの答えは混乱しています。 djangofilterbackendを使用してフィルタを設定すると、たとえば5のようなフィルタがあっても、クエリパラメータがないURL、または1つのクエリパラメータのみが存在しますか?私が意味することは、djangobackendドキュメントに示されている例のように、djagnofilterbackendを使用して、クエリパラメータを動的に使用できるかどうかです。すべてのクエリパラメータがそこにあるとは限りません。 –

+0

はい、クエリパラメータがないURLを許可します。この例に示すように、違いはありません。値が存在する場合はクエリパラメータが有効になります。 –

+0

ok次に、すべてのクエリパラメータが正しく表示されているわけではありません。 –

関連する問題