Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将中的列表转换为queryset django_Python_Django_List_Django Queryset - Fatal编程技术网

Python 如何将中的列表转换为queryset django

Python 如何将中的列表转换为queryset django,python,django,list,django-queryset,Python,Django,List,Django Queryset,我有一个查询集(实际上已过滤),如下所示 正如我们在上面看到的,我们通过过滤查询集创建了一个列表,但我希望结果是查询集 那么,有没有办法将列表转换为查询集对象呢?事实上,我通过谷歌搜索找到了一种方法,但如果有大量记录,这可能需要大量时间来查询/生成结果 custom_list = [rec.id for rec in posts if 'string_or_field' in rec.tags.all()] querset = MyModel.objects.filter(id__in=cus

我有一个查询集(实际上已过滤),如下所示

正如我们在上面看到的,我们通过过滤
查询集
创建了一个
列表
,但我希望结果是
查询集


那么,有没有办法将
列表
转换为
查询集
对象呢?

事实上,我通过谷歌搜索找到了一种方法,但如果有大量记录,这可能需要大量时间来查询/生成结果

custom_list = [rec.id for rec in posts if 'string_or_field' in rec.tags.all()]

querset = MyModel.objects.filter(id__in=custom_list)

您可以先查询
标记
对象,然后使用这些ID过滤
Post

tags = Tag.objects.filter(field_name='string_or_field')
posts = Post.objects.filter(tags__in=tags)

如果数据库中已存在每个列表项,则前面的答案是正确的,但有时情况并非如此。在这种情况下,您可以基于列表创建queryset存根,并根据需要实现queryset方法和queryset属性

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)

下面是一个简单的util,您可以运行它从列表生成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)

你到底为什么需要一个真正的查询集?duck类型的要点是,您应该能够使用任何类似于列表的构造。是的,实际上我需要一个queryset来执行一些操作,因为它是一个对象,但我得到了一个如上所述的列表,所以希望将结果列表转换为queryset。这不起作用。首先,你不能将
模型
传递给一个类。为什么?这对我有用。请提供更多信息以解决您的问题。
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)
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)