2010-08-03 103 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) 

是的,我需要的Model2的供以后使用一个QuerySet落得(特别是要传递给Django的形式)。

在上面的第一个代码块中,即使我使用filter而不是get,我显然会拥有Model1的QuerySet。在我的情况下,反向查找可能并不总是可能的。

+0

对不起,目前尚不清楚你实际上想做什么。请显示你想要开始和结束。 – 2010-08-03 14:31:31

+0

我想说的是,如果我已经可以通过使用obj1.model2来引用Model2对象,那么有一种方法可以将这些对象添加到Model2对象的QuerySet中将是非常好的。 – chefsmart 2010-08-03 18:05:33

+0

我也无法追随你的目标。如果你可以发布你的模型的相关代码,并添加一句或两句关于你在做什么的一般性描述,我们可能会提供帮助。 – 2010-08-03 21:04:11

回答

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

这是一个干净的解决方案。我不认为像Arthur建议的那样使用'_result_cache'是个好主意。 – 2015-03-01 17:51:19

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 2015-03-12 13:59:13

-5
use d = insp.registered_tasks() 
相关问题