2010-08-03 2 views
17

В принципе мне нужен изящный способ сделать следующее: -вручную создать Django QuerySet или, скорее вручную добавлять объекты в 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]) 

Я не могу думать правильно, но делать что-то вроде следующего кажется бесконечно глупо мне .: -

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

Да, мне нужно закончить с QuerySet из model2 для последующего использования (в частности, чтобы перейти к форме Django).

В первом блоке кода выше, даже если я использую filter вместо get У меня, очевидно, будет QuerySet Model1. Обратный поиск не всегда возможен в моем случае.

+0

Извините, не ясно, что вы на самом деле пытаетесь сделать. Пожалуйста, покажите, с чего вы хотите начать и закончите. –

+0

Я пытаюсь сказать, что если я уже могу ссылаться на объекты Model2 с помощью obj1.model2, было бы замечательно иметь возможность добавлять эти объекты в объекты QuerySet для Model2. – chefsmart

+0

Я тоже не могу последовать за тобой. Если вы можете опубликовать соответствующий код для своих моделей и добавить предложение или два из общего описания того, что вы после этого, мы сможем помочь. –

ответ

33

Если вы просто ищете создание набора элементов, которые вы выбираете с помощью сложного процесса, не представляемого в SQL, вы всегда можете использовать оператор __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) 

Вам, очевидно, придется приспособить это к вашей ситуации, но оно должно по крайней мере дать вам отправную точку.

4

Вы не можете вручную добавлять объекты в QuerySet. Но почему бы вам не включить их в список?

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

Это чистое решение. Я не думаю, что использование '_result_cache', как предложил Артур, - хорошая идея. –

15

Чтобы вручную добавить объекты в QuerySet, попробуйте _result_cache:

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

PS: Я не понял (или пытался) вопрос chefsmart, но я считаю, что ответы на вопрос в заголовке.

+5

Это использует внутреннюю реализацию API, которая может быть изменена при любом обновлении. – anizzomc

Смежные вопросы