如何将列表转换为queryset django

Shi*_*dla 9 python django list django-queryset

我有一个queryset(实际过滤),如下所示

posts = [<Post: published>, <Post: needs>, <Post: be>, <Post: issues>, <Post: to>, <Post: tags>]
Run Code Online (Sandbox Code Playgroud)

但我需要手动过滤上面的查询集,其中一些字段来自另一个表/地方等.

所以我过滤了下面的东西

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()]
Run Code Online (Sandbox Code Playgroud)

因此,正如我们可以在上面观察到的那样,我们list通过过滤a 来创建一个queryset,但我希望结果为a queryset.

那么有没有办法将其转换listqueryset对象?

Pau*_*ida 11

您可以先查询Tag对象并Post使用这些ID进行过滤:

tags = Tag.objects.filter(field_name='string_or_field')
posts = Post.objects.filter(tags__in=tags)
Run Code Online (Sandbox Code Playgroud)


Shi*_*dla 10

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

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

querset = MyModel.objects.filter(id__in=custom_list)
Run Code Online (Sandbox Code Playgroud)


Ily*_*hov 6

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

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)
Run Code Online (Sandbox Code Playgroud)