1

次のオプションのフィルターがあります。

cat_id = self.request.GET.get('cat_id', '')
return Product.objects.filter(category__pk=cat_id)

オプションのcat_idが渡されない場合、次のエラーが発生します。

ValueError at /api/products/
invalid literal for int() with base 10: ''

私の質問は、cat_idが渡されないときにフィルターが次のようになるようにするにはどうすればよいですか...

return Product.objects.filter()

または、誰かが私にもっと良い方法を教えてもらえますか?10個のオプションのフィルターを含めるとどうなりますか?

4

1 に答える 1

5

もしかしてこういうこと?

filters = {}

cat_id = self.request.GET.get('cat_id', None)

if cat_id:
    filters["category__pk"] = cat_id

return Product.objects.filter(**filters)

編集:フィルタリングする引数がかなりある場合は、次のようなことを試してみます(テストされていません):

# with all your possible lookups here
possible_filters = {"cat_id": "category__pk", "colour": "colour__pk", }

# and then go through the provided fields, and toggle the filters accordingly
enabled_filters = { possible_filters[filter]: self.request.GET[filter] for filter
                    in possible_filters
                    if self.request.GET.get(filter, None) }

return Product.objects.filter(**enabled_filters)
于 2013-02-18T13:43:20.473 に答える