2017-05-02 11 views
0

私は入力フィールドからの日付と入力フィールドからの日付を持っています。私が日付範囲を渡すとうまくいきます。しかし、1つまたは両方の空白を残すと、すべてのアイテムまたは部分的なアイテムを取得するときに、ValueErrorが返されます。デフォルトの空の文字列を作成しようとすると、クエリ値またはフォーマットエラーとしてNoneを使用できません。Django:空の日付文字列はすべて返される

def report(self, request): 
    date_from = query['date_from'] if query['date_from'] else None 
    date_to = query['date_to'] if query['date_to'] else None 

    queryset = Client.objects.filter(
     client_code__in=clients, 
     account__note__creation_time__gte=date_from, 
     account__note__creation_time__lte=date_to, 
    ) 

より良いコンテキストを与えることを、私は空の両方のフィールドを残せば、私はフィールドから日付を記入しますが空のフィールドする日付を残せば今、私は日からすべてのアイテムを取得する必要がありますし始めてから、すべてのアイテムを取得する必要があります今から今まで。もし私がフィールドの日付をフィールドから空の日付を購入している、私は日付までの最初からアイテムを取得する必要があります。

怠け者になって、うまく機能するソリューションを見つけましたが、それほど幸せではありません。誰かが分かち合うことが分かれば、より良いことが分かります。

query = Q() 
if clients: 
    clients = clients.split(',') 
    query &= Q(client_code__in=clients) 
if date_from: 
    query &= Q(account__note__creation_time__gte=date_from) 
if date_to: 
    query &= Q(account__note__creation_time__lte=date_to) 

Client.objects.filter(query) 
+0

あなたが何を求めているのか分からない。このように動作する理由について説明したいですか? DjangoやPythonの動作方法を変更するようにあなたに要求していますか?コード内の問題を特定しますか? –

+0

私の質問は私のコードにすることができますので、date_fromまたは左の空白の場合、querysetはその条件を無視する必要があります。 –

+0

あなたが好きではない方法は、あなたがそれをやる方法です。あなたはあらゆる種類の方法を賢明にすることができますが、要点は、Djangoに日付の列が日付よりも大きいか小さい日付のクエリを実行するように要求しています。 Djangoはそれと何をやっているのですか?それとも、その問題のデータベース。それはあなたが望むものを知らない。 –

答えて

0

あなたはそのフィルタの有効な値を指定する必要がクエリセットにフィルタを置く場合... Djangoはあなたが実際にした後、すべてのフィルタを望んでいないことを推測することはできません...

しかし、

qs = Client.objects.all() 

if date_from: 
    qs = qs.filter(account__note__creation_time__gte=date_from) 
if date_to: 
    qs = qs.filter(account__note__creation_time__lte=date_to) 

# etc etc for all your AND queries. 
# but for OR type queries you need to use Q objects. 

あなたはクエリセットを作成するときに、私はClient.objects.allを使用していたとして、それが実際にデータベースにアクセスし、すぐにオブジェクトを取得しません:それは少しよりよい探して作る方法、例えばがあります。その結果、クエリセットを追加してクエリセットを変更し、結果を制限することができます。クエリーセットを使う方法は、order_by()fetch_related()など、さまざまなクエリーセットのすべてのメソッドを使用できます。あなたはクエリセットを反復処理して、オブジェクトを読み取ろうとするまで、それは実際に例えば、任意のSQLを実行しません。すべてのフィルタは、検索を絞り込むれる場合

# now it will go to the database and get the objects based on your filters. 
for instance in qs: 
    print instance 

だから、あなたは、この場合には、参照(これらは全てですAND)、Q()を使用する必要がなくなり、タイピングと明確なコードが少なくなります。しかし、ORロジックを使用している照会を行っている場合や、複数の照会セットに同じ照会を適用している場合は、Qクラスを使用してその照会を構成する必要があります。

関連する問題