2016-07-07 17 views
0

私は2つのモデルを持っており、1つはForeignKeyと一致させようとしています。そのためには、特定の番号と日付で2番目のモデルを検索しています。問題は2つの日付があり、どの日付を選択するか決定する必要があるということです。状況によってはNULLに設定されますが、そうでない場合もあります。それは私は2番目の日付フィールドを取得する必要がある場合。質問のDjango条件式

class MyModel1(models.Model): 
    model2_key = models.ForeignKey(MyModel2) 
    model1_date=... 
    model1_number=... 

第2のモデル::

class MyModel2(models.Model): 
    model2_date1=... 
    model2_date2=... 
    model2_number=... 

は今、どのような選択をする私はこのようなものがありますか?私はF expressionsQ expressionsWhen expressionsSelectに関するドキュメントを探しました。私はちょっと混乱しています。 MyModel2オブジェクトを検索して返す関数をどのようにwrtieできますか?私はこのようなものを持っているが、うまくいかない。

def _find_model2(searched_date, searched_number): 
    searched_model2=MyModel2.objects.get(Q(model2_number=searched_number), 
        Q(When(model2_date1__e='NULL', then=model2_date2) | 
        Q(When(model2_date1__ne='NULL', then=model2_date1))=searched_date)) 

私はかなり新しいジャンゴになっているので、どんな助けにも感謝します。

答えて

0

私はこの問題を回避するために、私はそれが最も効率的でエレガントなものではないと思っていますが、動作します。誰かがもっと良い解決策を持っていればいいですか?

まず、その対応する日付と一致するすべてのオブジェクトが呼び出されます。

from_query = list(MyModel2.objects.filter(Q(model2_date1__range= 
(datetime_min, datetime_max)) | Q(model2_date2__range=(datetime_min, datetime_max)), 
    model2_number=searched_number)) 

それから私は、反復処理するオブジェクトを見つけました:

to_return = [] 
for item in from_query: 
    if item.model2_date1: 
     to_return.append(item) 
    elif datetime_min <= item.model2_date2 <= datetime_max: 
     to_return.append(item) 

編集:私は解決策を作ってみました。 model2_date1__isnull=Trueで十分です。解決策は、次のようになります。

from_query = list(MyModel2.objects.get((Q(model2_date1__range=(datetime_min, datetime_max)) | 
               Q(Q(model2_date2__range=(datetime_min, datetime_max)), 
               Q(model2_date1__isnull=True)), 
               model2_number=searched_number)) 
+0

がい 'MyModel2.objects.filter(Q(model2_date1 = searched_date)| Q(model2_date2 = searched_date))フィルタ(model2_number = searched_number)'動作しませんか? – Justin

+0

日付のうちの1つが時々設定されないことがあり、これがオブジェクトがクエリと一致するかどうかを判断する基準です。 – gonczor