Django ORM使用exclude实现任意条件为真即排除数据问题
问题根源
Django ORM的exclude()方法传入多个逗号分隔的参数时,默认采用AND逻辑,仅当所有条件同时满足时才会排除对应记录,和你需要的「任意条件满足就排除」的OR逻辑不符。
你当前的写法exclude(rated_1=False, rated_2=False)实际执行逻辑是:排除同时满足rated_1为假且rated_2为假的记录,和预期要求完全相反。
解决方案
使用Django的Q对象实现OR逻辑的排除条件:
- 在
views.py头部导入Q对象:
from django.db.models import Q
- 修改查询语句:
def page(request): queryset = Rate.objects.filter(completed=False).exclude(Q(rated_1=True) | Q(rated_2=True)) context = {'queryset':queryset} return render(request, 'page.html', context)
效果说明
修改后查询保留的记录需要同时满足以下所有要求:
completed字段值为Falserated_1字段值为Falserated_2字段值为False
只要rated_1或rated_2任意一个为真,对应记录就会被排除,完全符合需求。
内容的提问来源于stack exchange,提问作者user17005924
相关产品推荐
相关产品推荐

