【问题标题】:Django 'objects.filter()' with list?带有列表的 Django 'objects.filter()'?
【发布时间】:2011-08-22 19:40:02
【问题描述】:

可以通过这种方式限制QuerySet:

creators_list = ['jane', 'tarzan', 'chita']
my_model.objects.filter(creator=creators_list)

???

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    你的意思是这样的?

    my_model.objects.filter(creator__in=creator_list)
    

    文档:http://docs.djangoproject.com/en/dev/ref/models/querysets/#in

    编辑

    现在有点过时了。如果您在使用原始代码时遇到问题,请尝试以下操作:

    from django.db.models import Q
    
    my_filter_qs = Q()
    for creator in creator_list:
        my_filter_qs = my_filter_qs | Q(creator=creator)
    my_model.objects.filter(my_filter_qs)
    

    可能有更好的方法,但我目前无法对其进行测试。

    【讨论】:

    • 当然假设创建者字段是某种 CharField
    • @Bryce:宇宙的祝福还不够吗;)?
    • 你认为宇宙之外还有其他东西吗?
    • 感谢链接到 django 的文档 Bryce。我写了这个,但在过去,我的知识在 django 的一部分中更好,因为时间在流逝,但我想直接从像你这样的人那里学到一些东西:)
    • @Chris 也许不止一个宇宙,也许我们只是某个多元宇宙的一部分:p,你永远不知道。
    【解决方案2】:

    此外,如果您使用 sqlite 并遇到问题,列表中的最大项目数存在限制。

    def divideChunks(l, n):
        for i in range(0, len(l), n):
            yield l[i:i + n]
    
    for slicerange in divideChunks(objs, 10):
            myobjects = my_model.objects.filter(creator__in = slicerange)
            ...
    

    【讨论】:

    • 只是一个建议,永远不要在 db 上进行迭代......它们具有索引和其他功能......这就是它们存在的原因......它们不仅仅是数组......远不止于此...这将大大降低性能...请检查以下答案:stackoverflow.com/a/5956422/10305444
    猜你喜欢
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 2019-09-11
    • 2020-09-05
    • 2012-05-28
    • 2015-05-31
    • 1970-01-01
    相关资源
    最近更新 更多