如何创建一个空的查询集并在django中手动添加对象

use*_*817 24 django django-queryset

我需要创建一个查询集并手动添加一些我从不同查询结果中获得的对象,以便在表中显示它.我使用xx = set()但它没有完成这项工作.

kar*_*ikr 26

您可以通过以下方式之一进行操作:

from itertools import chain
#compute the list dynamically here:
my_obj_list = list(obj1, obj2, ...)
#and then 
none_qs = MyModel.objects.none()
qs = list(chain(none_qs, my_obj_list))
Run Code Online (Sandbox Code Playgroud)

你也可以这样做:

none_qs = MyModel.objects.none()
qs = none_qs | sub_qs_1 | sub_qs_2
Run Code Online (Sandbox Code Playgroud)

然而,这不是对切片查询集工作

  • 动态创建一个列表,然后立即附加它. (3认同)
  • 不起作用。类型(qs)=列表 (2认同)
  • @karthikr 我正在尝试从对象列表手动创建查询集。我的评论有点简略。qs 的类型仍然是您给出的第一个代码示例中的列表 - 现在查看它应该是显而易见的。 (2认同)

Dan*_*man 11

你不能这样做.查询集是数据库查询的表示.您无法手动向其添加项目.

但是如果你需要任意有序的模型实例集合,只需使用一个列表.

  • 我是否应该猜测`getXtable`是什么,或者为什么它不起作用? (4认同)

luk*_*aus 9

我真的迟到了,但是为了将来的参考,您可以创建一个查询集,然后对具有特定属性的对象进行过滤.

过滤字段对象属性

Model.objects.filter(foo='bar')
Model.objects.exclude(foo='bar')
Run Code Online (Sandbox Code Playgroud)

过滤非字段对象属性

def return_queryset_with_desired_objects(self):
    qs = SomeModel.objects.all()
    wanted_ids = [obj.id for obj in qs if obj.foo]
    return self.filter(id__in=wanted_ids]

def return_queryset_without_undesired_objects(self):
    qs = SomeModel.objects.all()
    unwanted_ids = [obj.id for obj in qs if not obj.foo]
    return self.exclude(id__in=unwanted_ids]
Run Code Online (Sandbox Code Playgroud)