0
if 'category' and 'something' and 'from_price' and 'to_price' in request.GET:
        category = request.GET['category']
        something = request.GET['something']
        from_price = request.GET['from_price']
        to_price = request.GET['to_price']

        d = Data.objects.filter(Q(category = category)| Q(something = something)|Q(price__gt=from_price)|Q(price__lt=to_price))

このデータをフィルタリングする方法 (たとえば) のみを入力した場合はto_price? (すべてのフィールドではありません)

コードがうまく動かない

4

2 に答える 2

0
sum(1 for x in ('category', 'something', 'from_price', 'to_price') if x in request)

現在のフィールドの数 (0 から 4) を返します。次に、この数が 2 か 3 かを確認できます。

于 2013-02-21T12:09:39.780 に答える
0

どうですか

import operator
conds = (request.GET.get(f) for f in ('category', 'something', 'from_price', 'to_price'))
if any(conds):
    d = Data.objects.filter(
            reduce(operator.or_, 
                (Q(**{a:b}) for a,b in zip(('category', 'something', 'price__gt', 'price__lt'), filter(lambda x: x, conds)))))

ifd は、実行が成功した後のステートメントとコード内でのみ使用できることに注意してください。

# or

category = request.GET.get('category')
something = request.GET.get('something')
from_price = request.GET.get('from_price')
to_price = request.GET.get('to_price')

q = Q()
if category:
    q |= Q(category=category)
if something:
    q |= Q(something=something)
if from_price:
    q |= Q(price__gt=from_price)
if to_price:
    q |= Q(price__lt=to_price)

d = Data.objects.filter(q)
于 2013-02-21T12:19:00.180 に答える