【问题标题】:Django object multiple exclude()Django 对象多个 exclude()
【发布时间】:2010-10-29 02:12:42
【问题描述】:

有没有办法进行查询并排除事物列表,而不是多次调用 exclude?​​p>

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    根据您对 Ned 的回复,您似乎只想排除标签列表。所以你可以只使用in 过滤器:

    names_to_exclude = [o.name for o in objects_to_exclude] 
    Foo.objects.exclude(name__in=names_to_exclude)
    

    这样做是你想要的吗?

    【讨论】:

    • 我直接使用 objects_to_exclude 列表,我不使用 o.name:ignore_tags = request.user.ignore_tags.all() case_list = Case.objects.exclude(tags__in = ignore_tags ))
    【解决方案2】:

    多次调用 exclude 有什么问题?查询是惰性的,除非您尝试从中提取数据,否则不会发生任何事情,因此多次使用 .exclude() 没有任何缺点。

    【讨论】:

    • 我有一个模型,它有一个标签 manytomany 字段。用户可以有大量的忽略标签。我想动态排除用户不想看到的对象。直到运行时,我不知道要调用多少次排除。
    • 你能解释一下“查询是懒惰的”和“从中提取数据”的意思吗?谢谢
    • 懒惰的意思是在实际使用查询之前,不会从数据库中拉取任何数据。
    【解决方案3】:

    你也可以试试这个。

    exclude_list = ['A', 'B', 'C'] qs = Foo.objects.exclude(items__in=exclude_list)

    【讨论】:

    • 这对我有用,谢谢。
    【解决方案4】:

    您可以使用Q object 轻松做到这一点:

    from django.db.models import Q
    
    excludes = None
    for tag in ignored_tags:
        q = Q(tag=tag)
        excludes = (excludes and (excludes | q)) or q # makes sure excludes is set properly
    set_minus_excluded = Foo.objects.exclude(excludes)
    

    您还应该能够使用 exclude() 动态执行此操作:

    qs = Foo.objects.all()
    for tag in ignored_tags:
        qs = qs.exclude(tag=tag)
    

    【讨论】:

      【解决方案5】:

      为了改进 Daniel Roseman 的回答,我认为最好直接从查询集中获取您需要的值,而不是在大型数据集上可能很昂贵的 for 循环,即

      names_to_exclude = objects_to_exclude.values_list('name')
      Foo.objects.exclude(name__in=names_to_exclude)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-18
        • 1970-01-01
        • 2020-06-25
        • 1970-01-01
        • 2012-02-26
        • 2021-01-10
        • 2017-05-06
        相关资源
        最近更新 更多