﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
33705	IsNull() lookup cannot be used directly in filters.	Florian Apolloner	David Wobrock	"The docs in https://docs.djangoproject.com/en/4.0/ref/models/lookups/#django.db.models.Lookup seem to suggest that 
{{{
<lhs>__<lookup_name>=<rhs>
}}}
is somewhat equivalent to
{{{
<lookup_name>(<lhs>, <rhs>)
}}}

This does work for some lookups, but not for `IsNull`:

{{{
>>> from django.contrib.auth.models import User
>>> from django.db.models import F
>>> from django.db.models.lookups import GreaterThan, IsNull
>>> User.objects.filter(GreaterThan(F('pk'), 1000))
DEBUG 2022-05-13 10:45:10,907 utils 63853 (0.006) SELECT ""auth_user"".""id"", ""auth_user"".""password"", ""auth_user"".""last_login"", ""auth_user"".""is_superuser"", ""auth_user"".""username"", ""auth_user"".""first_name"", ""auth_user"".""last_name"", ""auth_user"".""email"", ""auth_user"".""is_staff"", ""auth_user"".""is_active"", ""auth_user"".""date_joined"" FROM ""auth_user"" WHERE ""auth_user"".""id"" > (1000) LIMIT 21; args=(1000,); alias=default
<QuerySet []>
>>> User.objects.filter(IsNull(F('pk'), True))
Traceback (most recent call last):
  File ""<console>"", line 1, in <module>
  File ""/home/florian/dev/bap/observer/server/__pypackages__/3.10/lib/django/db/models/manager.py"", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File ""/home/florian/dev/bap/observer/server/__pypackages__/3.10/lib/django/db/models/query.py"", line 1071, in filter
    return self._filter_or_exclude(False, args, kwargs)
  File ""/home/florian/dev/bap/observer/server/__pypackages__/3.10/lib/django/db/models/query.py"", line 1089, in _filter_or_exclude
    clone._filter_or_exclude_inplace(negate, args, kwargs)
  File ""/home/florian/dev/bap/observer/server/__pypackages__/3.10/lib/django/db/models/query.py"", line 1096, in _filter_or_exclude_inplace
    self._query.add_q(Q(*args, **kwargs))
  File ""/home/florian/dev/bap/observer/server/__pypackages__/3.10/lib/django/db/models/sql/query.py"", line 1502, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File ""/home/florian/dev/bap/observer/server/__pypackages__/3.10/lib/django/db/models/sql/query.py"", line 1532, in _add_q
    child_clause, needed_inner = self.build_filter(
  File ""/home/florian/dev/bap/observer/server/__pypackages__/3.10/lib/django/db/models/sql/query.py"", line 1370, in build_filter
    condition = filter_expr.resolve_expression(self, allow_joins=allow_joins)
  File ""/home/florian/dev/bap/observer/server/__pypackages__/3.10/lib/django/db/models/lookups.py"", line 174, in resolve_expression
    c.rhs = self.rhs.resolve_expression(
AttributeError: 'bool' object has no attribute 'resolve_expression'
}}}"	Bug	closed	Database layer (models, ORM)	4.0	Release blocker	fixed		Florian Apolloner David Wobrock	Ready for checkin	1	0	0	0	0	0
