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

che*_*art 24 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])
Run Code Online (Sandbox Code Playgroud)

我可能没有想到,但对我来说做类似下面的事似乎无比愚蠢: -

obj1 = Model1.objects.select_related('model2').get(attribute1=value1)
model2_qs = Model2.objects.filter(pk=obj1.model2.pk)
Run Code Online (Sandbox Code Playgroud)

是的,我需要最终使用Model2的QuerySet供以后使用(特别是传递给Django表单).

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

Jud*_*ill 36

如果您只是想创建一个项目的查询集,您可以通过一些在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)
Run Code Online (Sandbox Code Playgroud)

你显然必须根据你的情况调整它,但它至少应该给你一个起点.


Art*_*hur 16

要手动将对象添加到QuerySet,请尝试_result_cache:

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

PS:我不理解(或试图)chefsmart的问题,但我相信这回答了标题中的问题.

  • 这使用了API的内部实现,可能会在任何升级中发生变化. (8认同)

Nic*_*rdu 6

您无法手动将对象添加到查询集。但你为什么不把它们列在一个列表中呢?

obj1 = Model1.objects.select_related('model2').get(attribute1=value1)
obj2 = Model1.objects.select_related('model2').get(attribute2=value2)
model2 = list(obj1, obj2)
Run Code Online (Sandbox Code Playgroud)