我的要求是能够通过字符串属性访问 evaluated QuerySet的成员,在本例中为name
。我不喜欢在QuerySet上循环的想法,因为似乎有一种更有效的方法。
在我调用了类似以下内容之后:
my_objects = MyObject.objects.all()
我用这样的话来评价它:
len(my_objects)
从一个已计算的QuerySet中按名称获取特定结果的最佳方法是什么,在本例中是my_objects
?理想情况下,我希望看到类似my_objects.filter(foo='bar')
的结果。
注在处理过程中,我需要计算的QuerySet中的所有结果,因此我在一个初始查询中就有了它。
3条答案
按热度按时间wf82jlnq1#
没有直接的方法可以从queryset中获取基于字段值的对象,但是你可以从queryset中创建一个字典,并将
name
设置为key(必须是唯一的):FYI:如果您只想从表中检索单个对象,则可以使用.get方法:
ds97pgxw2#
被评估的查询集是一个列表。没有列表元素的索引,所以无论如何都需要循环。但是被评估的查询集被认为不是很大,最多几百个条目,所以循环是可以的。不要评估大的查询集。
顺便说一下,
prefetch_related()
也创建了类似的对象列表。ListQuerySet
的一个实现支持许多过滤器、排序和不同过滤器,使得对这样的对象列表运行许多(但不是所有)查询成为可能:https://github.com/Dmitri-Sintsov/django-jinja-knockout/blob/master/django_jinja_knockout/query.py
jv4diomz3#
@aamir-rind的解决方案很棒,但只有在
name
是唯一的情况下才有效。例如,如果
name
不是唯一的,则可以将对象收集到列表中:如果
my_objects
还没有被计算,循环将计算它。如果my_objects
已经被计算,例如在my_objects = list(MyModel.objects.all())
中,它将不再被计算。