2010-08-03 19 views
17

Necesito básicamente una forma elegante de hacer lo siguiente: -crear manualmente un Django QuerySet o más bien manualmente agregar objetos a un QuerySet

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

que puede no ser el pensamiento correcto, pero haciendo algo como lo siguiente parece infinitamente estúpida me .: -

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

Sí, tengo que terminar con un QuerySet de Modelo2 para su uso posterior (en concreto, para pasar a una forma de Django).

En el primer bloque de código anterior, incluso si uso filter en lugar de get obviamente tendré un QuerySet de Model1. Las búsquedas inversas pueden no ser siempre posibles en mi caso.

+0

Lo sentimos, no está claro lo que realmente está tratando de hacer. Por favor, muestra lo que quieres comenzar y terminar. –

+0

Lo que estoy tratando de decir es que, si ya puedo referirme a los objetos de Model2 usando obj1.model2, sería genial tener una forma de agregar estos objetos a los objetos QuerySet de Model2. – chefsmart

+0

Tampoco puedo seguir lo que está buscando. Si puede publicar el código relevante para sus modelos y agregar una o dos oraciones de descripción general de lo que está buscando, podríamos ayudarlo. –

Respuesta

33

Si simplemente busca crear un conjunto de consulta de elementos que elija a través de algún proceso complicado no representable en SQL, siempre puede usar el operador __in.

wanted_items = set() 
for item in model1.objects.all(): 
    if check_want_item(item): 
     wanted_items.add(item.pk) 

return model1.objects.filter(pk__in = wanted_items) 

Obviamente tendrá que adaptar esto a su situación, pero al menos debería darle un punto de partida.

4

No puede agregar objetos manualmente a un QuerySet. ¿Pero por qué no los pones en una lista?

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

Esta es una solución limpia. No creo que usar '_result_cache' como Arthur sugirió sea una buena idea. –

15

Para añadir manualmente objetos a un QuerySet, intente _result_cache:

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

PS: Yo no entiendo (o intentado) la pregunta de chefsmart pero creo que esta respuesta a la pregunta en el título.

+5

Esto usa la implementación interna de la API, que puede cambiar en cualquier actualización. – anizzomc

-5
use d = insp.registered_tasks() 
Cuestiones relacionadas