Fixed #23797 -- Fixed QuerySet.exclude() when rhs is a nullable column. #13118
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixes https://code.djangoproject.com/ticket/23797
The referenced ticket demonstrates that
exclude()
andfilter()
are not complementary when the value of anF()
expression is NULL. The discussion on the ticket reports that:•
exclude()
andfilter()
should be complementary, and thus thatexclude()
should return a record where theF()
expression evaluates to NULL• The requisite query should be:
NOT ((length = width) AND (length IS NOT NULL) AND (width IS NOT NULL))
to avoid performance problems withIS TRUE
, which is to say, forexclude()
to return a record, one of three things must obtain: the comparison test fails, the tested value is null, or the comparison value is null.• The change should happen directly in
build_filter()
Then discussion trails off. This was straightforward to implement; I just needed to check if the value (in the place of the F expression) was an instance of a
Col
before adding theIS NOT NULL
clause. I look forward to your feedback. :-)