2016-07-07 3 views
0

Ich habe zwei Modelle, eins mit ForeignKey Ich versuche zu entsprechen. Um das zu tun, suche ich das zweite Modell nach einer bestimmten Nummer und einem Datum. Das Problem ist, es hat zwei Daten und ich muss mich entscheiden, welches Datum ich wählen soll. Unter bestimmten Umständen ist NULL gesetzt, in anderen nicht. Wenn es ist, muss ich das zweite Datumsfeld bekommen. Ich habe so etwas wie dies:Django bedingte Ausdrücke in Abfragen

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

zweites Modell:

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

Nun, wie die Wahl zu treffen? Ich habe die Dokumentation zu F expressions, Q expressions, When expressions, Select nachgeschlagen und bin ein wenig verwirrt. Wie kann ich eine Funktion schreiben, die das gesuchte Objekt MyModel2 zurückgibt? Ich habe so etwas, aber es wird nicht funktionieren.

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)) 

Ich bin ziemlich neu zu Django, so dass jede Hilfe geschätzt wird.

Antwort

0

Ich habe eine Abhilfe dieses Problem gemacht, ich denke nicht, dass es effizient und elegant ist, aber es funktioniert. Sollte jemand eine bessere Lösung haben, posten Sie es bitte.

Zunächst werden alle Objekte, deren entsprechende Daten übereinstimmen genannt werden:

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)) 

Dann fand ich iterieren Objekte:

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) 

EDIT: Ich habe mit einer Lösung zu kommen. Stellen Sie sicher, dass model2_date1__isnull=True genug ist. Die Lösung sieht nun so aus:.

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

Ist 'MyModel2.objects.filter (Q (model2_date1 = searched_date) | Q (model2_date2 = searched_date)) Filter (model2_number = searched_number)' nicht? – Justin

+0

Eines der Daten ist manchmal manchmal nicht eingerichtet und das ist das Kriterium, auf dem ich entscheiden muss, ob das Objekt Abfrage entspricht oder nicht. – gonczor