如何将列表转换为queryset django
Posted
技术标签:
【中文标题】如何将列表转换为queryset django【英文标题】:How to convert a list in to queryset django 【发布时间】:2013-09-07 14:21:08 【问题描述】:我有一个查询集(实际上是过滤的)如下
posts = [<Post: published>, <Post: needs>, <Post: be>, <Post: issues>, <Post: to>, <Post: tags>]
但我需要使用来自另一个表/位置等的某些字段手动过滤上述查询集。
所以我过滤了类似下面的内容
custom_list = []
for rec in posts:
if 'string_or_field' in rec.tags.all():
custom_list.extend(rec)
or
custom_list = [rec for rec in posts if 'string_or_field' in rec.tags.all()]
正如我们在上面看到的那样,我们通过过滤queryset
创建了一个list
,但我希望结果为queryset
。
那么有没有办法将list
转换为queryset
对象?
【问题讨论】:
为什么你需要一个实际的查询集?鸭子类型的重点是您应该能够使用任何类似列表的构造。 是的,实际上我需要一个查询集来执行一些操作,因为它是一个对象,但是我得到了一个上面的列表,所以想将结果列表转换为查询集 【参考方案1】:这是一个简单的实用程序,您可以运行它以从列表中生成 QS:
def list_to_queryset(model, data):
from django.db.models.base import ModelBase
if not isinstance(model, ModelBase):
raise ValueError(
"%s must be Model" % model
)
if not isinstance(data, list):
raise ValueError(
"%s must be List Object" % data
)
pk_list = [obj.pk for obj in data]
return model.objects.filter(pk__in=pk_list)
【讨论】:
【参考方案2】:如果数据库中已经存在每个列表项,则前面的答案是正确的,但有时情况并非如此。在这种情况下,您可以基于列表创建查询集存根,并根据需要实现查询集方法和查询集属性。
class ListAsQuerySet(list):
def __init__(self, *args, model, **kwargs):
self.model = model
super().__init__(*args, **kwargs)
def filter(self, *args, **kwargs):
return self # filter ignoring, but you can impl custom filter
def order_by(self, *args, **kwargs):
return self
qs = ListAsQuerySet(custom_list, model=Post)
【讨论】:
这不起作用。首先,您不能将model
传递给课程。
为什么?这对我有用。给我更多信息来解决你的问题。【参考方案3】:
您可以先查询Tag
对象并使用这些ID 过滤Post
:
tags = Tag.objects.filter(field_name='string_or_field')
posts = Post.objects.filter(tags__in=tags)
【讨论】:
【参考方案4】:实际上我通过谷歌搜索找到了一种方法,但是如果有大量记录,这可能需要很多时间来查询/生成结果
custom_list = [rec.id for rec in posts if 'string_or_field' in rec.tags.all()]
querset = MyModel.objects.filter(id__in=custom_list)
【讨论】:
以上是关于如何将列表转换为queryset django的主要内容,如果未能解决你的问题,请参考以下文章
Django - 如何将 QuerySet 转换为 Q 对象?