2010-08-03 9 views
17

Grundsätzlich ich eine anmutige Art und Weise müssen folgendes zu tun: -manuell eine Django QuerySet oder eher manuell hinzufügen Objekte zu einem QuerySet erstellen

obj1 = Model1.objects.select_related('model2').get(attribute1=value1) 
obj2 = Model1.objects.select_related('model2').get(attribute2=value2) 
model2_qs = QuerySet(model=Model2, qs_items=[obj1.model2,obj2.model2]) 

ich richtig denken kann nicht, aber etwas zu tun, wie unendlich die folgende scheint dumm ich .: -

obj1 = Model1.objects.select_related('model2').get(attribute1=value1) 
model2_qs = Model2.objects.filter(pk=obj1.model2.pk) 

Ja, ich brauche mit einem QuerySet von Model2 für die spätere Verwendung am Ende (genauer gesagt auf eine Django Form zu übergeben).

Im ersten Codeblock oben, auch wenn ich filter anstelle von get verwende, werde ich natürlich ein QuerySet von Model1 haben. Reverse-Lookups sind in meinem Fall möglicherweise nicht immer möglich.

+0

Sorry, es ist nicht klar, was Sie versuchen, tatsächlich zu tun. Bitte zeigen Sie, womit Sie beginnen und enden möchten. –

+0

Was ich zu sagen versuche, ist, wenn ich bereits auf Model2-Objekte mit obj1.model2 verweisen kann, wäre es toll, diese Objekte zu einem QuerySet von Model2-Objekten hinzuzufügen. – chefsmart

+0

Ich kann auch nicht folgen, was Sie suchen. Wenn Sie den entsprechenden Code für Ihre Modelle posten und einen oder zwei Sätze allgemeiner Beschreibung hinzufügen können, können wir Ihnen vielleicht helfen. –

Antwort

33

Wenn Sie einfach sie auf eine queryset von Elementen zu erstellen, die Sie durch einigen komplizierten Prozess entscheiden, nicht darstellbaren in SQL Sie immer den __in Operator nutzen könnten.

Sie müssen dies natürlich an Ihre Situation anpassen, aber es sollte Ihnen zumindest einen Ausgangspunkt geben.

4

Sie können Objekte nicht manuell zu einem QuerySet hinzufügen. Aber warum stellst du sie nicht in eine Liste?

obj1 = Model1.objects.select_related('model2').get(attribute1=value1) 
obj2 = Model1.objects.select_related('model2').get(attribute2=value2) 
model2 = list(obj1, obj2) 
+1

Dies ist eine saubere Lösung. Ich denke nicht, '_result_cache' zu ​​verwenden, wie Arthur vorgeschlagen hat, ist eine gute Idee. –

15

Um manuell Objekte zu einem QuerySet hinzufügen, versuchen _result_cache:

objs = ObjModel.objects.filter(...) 
len(objs) #or anything that will evaluate and hit the db 
objs._result_cache.append(yourObj) 

PS: Ich verstehe nicht (oder versucht) chefsmart Frage, aber ich glaube, das Antworten auf die Frage in Titel.

+5

Dies verwendet die interne Implementierung der API, die sich bei jedem Upgrade ändern kann. – anizzomc

-5
use d = insp.registered_tasks()