手动创建Django QuerySet或者手动将对象添加到QuerySet

时间:2010-08-03 14:23:05

标签: django django-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。在我的情况下,可能并不总是可以进行反向查找。

4 个答案:

答案 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()