如何过滤Django Queryset

时间:2015-11-02 00:33:00

标签: django filter django-queryset

如何在初始查询后过滤查询集?基本上我试图从查询集中删除一个项目(不从数据库中删除它)。

accounts = company_account.objects.filter(company=userinfo.company).all()
    for account in accounts:
        if not search in account.first_name_lower+" "+account.last_name_lower:
            account.remove()

2 个答案:

答案 0 :(得分:1)

您可以将Manager的方法应用于QuerySet对象。

首先:

最终.all()不需要:

accounts = company_account.objects.filter(company=userinfo.company).all()
# this is the same that
accounts = company_account.objects.filter(company=userinfo.company)

第二

如果要从查询集中排除对象,可以使用:

accounts = accounts.exclude(**criteria**)

第三

对于您的情况,您可以使用Concat(Django 1.8 +)来尝试:

from django.db.models import Value, CharField
from django.db.models.functions import Concat

accounts.annotate(full_name=Concat('first_name_lower', Value(' '), 'last_name_lower'),
                  output_field=CharField()).exclude(full_name=something_here)

答案 1 :(得分:0)

您不应该以这种方式使用queryset API。在您的情况下,您只需使用Q对象来过滤company_account

accounts = company_account.objects.filter(
     Q(first_name_lower__icontain=search) |
     Q(last_name_lower__icontain=search),
     company=userinfo.company,
).distinct()

或者更好,使用全文搜索方法。或者使用原始SQL查询。