繁体   English   中英

如何将列表转换为查询集 django

[英]How to convert a list in to queryset django

我有一个查询集(实际上是过滤的)如下

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()]

因此,当我们可以观察到上面我们正在创建一个list通过筛选queryset ,但我想要的结果作为queryset

那么有什么方法可以将list转换为queryset对象?

您可以先查询Tag对象并使用这些 id 过滤Post

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

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

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

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

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

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)

这是一个简单的实用程序,您可以运行它以从列表中生成 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM