在Django中过滤已计算的QuerySet

00jrzges  于 2022-11-26  发布在  Go
关注(0)|答案(3)|浏览(131)

我的要求是能够通过字符串属性访问 evaluated QuerySet的成员,在本例中为name。我不喜欢在QuerySet上循环的想法,因为似乎有一种更有效的方法。
在我调用了类似以下内容之后:

my_objects = MyObject.objects.all()

我用这样的话来评价它:

len(my_objects)

从一个已计算的QuerySet中按名称获取特定结果的最佳方法是什么,在本例中是my_objects?理想情况下,我希望看到类似my_objects.filter(foo='bar')的结果。
注在处理过程中,我需要计算的QuerySet中的所有结果,因此我在一个初始查询中就有了它。

wf82jlnq

wf82jlnq1#

没有直接的方法可以从queryset中获取基于字段值的对象,但是你可以从queryset中创建一个字典,并将name设置为key(必须是唯一的):

my_objects = MyObject.objects.all()
obj_dict = {obj.name: obj for obj in my_objects}
print obj_dict['any_name']

FYI:如果您只想从表中检索单个对象,则可以使用.get方法:

obj = MyObject.objects.get(pk=id)
or
obj = MyObject.objects.get(name='unique_name')
ds97pgxw

ds97pgxw2#

被评估的查询集是一个列表。没有列表元素的索引,所以无论如何都需要循环。但是被评估的查询集被认为不是很大,最多几百个条目,所以循环是可以的。不要评估大的查询集。
顺便说一下,prefetch_related()也创建了类似的对象列表。ListQuerySet的一个实现支持许多过滤器、排序和不同过滤器,使得对这样的对象列表运行许多(但不是所有)查询成为可能:
https://github.com/Dmitri-Sintsov/django-jinja-knockout/blob/master/django_jinja_knockout/query.py

jv4diomz

jv4diomz3#

@aamir-rind的解决方案很棒,但只有在name是唯一的情况下才有效。
例如,如果name不是唯一的,则可以将对象收集到列表中:

# map name to list of objects
my_objects_dict = dict()
for obj in my_objects:
    key = obj.name
    if key not in my_objects_dict:
        my_objects_dict[key] = []
    my_objects_dict[key].append(obj)

如果my_objects还没有被计算,循环将计算它。如果my_objects已经被计算,例如在my_objects = list(MyModel.objects.all())中,它将不再被计算。

相关问题