基本上我需要一种优雅的方式来执行以下操作: -
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 :(得分:35)
如果您只是想创建一个通过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)
你显然必须根据你的情况调整它,但它至少应该给你一个起点。
答案 1 :(得分: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的问题,但我相信这会回答标题中的问题。
答案 2 :(得分:4)
您无法手动将对象添加到QuerySet。但是你为什么不把它们列入清单?
obj1 = Model1.objects.select_related('model2').get(attribute1=value1)
obj2 = Model1.objects.select_related('model2').get(attribute2=value2)
model2 = list(obj1, obj2)
答案 3 :(得分:-7)
use d = insp.registered_tasks()