﻿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
28896	GeoDjango PointField fails to generate query if filtering on a NULL value	William Li	Sergey Fedoseev	"Environment:
* Python 3.6.3
* postgres 9.6.6
* Django 2.0

Note: This was working under Django 1.11.7.

{{{
# models.py
from django.contrib.gis.db import models

class Restaurant(models.Model):
  location = models.PointField(blank=True, null=True, db_index=True)
}}}


{{{
# tests.py
from django.test import TestCase
from restaurants.models import Restaurant


class RestaurantTestCase(TestCase):
    def test_no_location(self):
        # Failing query
        Restaurant.objects.filter(location=None)
}}}


{{{
$ python manage.py testCreating test database for alias 'default'...
System check identified no issues (0 silenced).
E
======================================================================
ERROR: test_no_location (restaurants.tests.RestaurantTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File ""/home/wli/projects/point-field-bug/restaurants/tests.py"", line 7, in test_no_location
    Restaurant.objects.filter(location=None)
  File ""/home/wli/.envs/point-field-bug/lib/python3.6/site-packages/django/db/models/manager.py"", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File ""/home/wli/.envs/point-field-bug/lib/python3.6/site-packages/django/db/models/query.py"", line 836, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File ""/home/wli/.envs/point-field-bug/lib/python3.6/site-packages/django/db/models/query.py"", line 854, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File ""/home/wli/.envs/point-field-bug/lib/python3.6/site-packages/django/db/models/sql/query.py"", line 1252, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File ""/home/wli/.envs/point-field-bug/lib/python3.6/site-packages/django/db/models/sql/query.py"", line 1276, in _add_q
    split_subq=split_subq,
  File ""/home/wli/.envs/point-field-bug/lib/python3.6/site-packages/django/db/models/sql/query.py"", line 1214, in build_filter
    condition = self.build_lookup(lookups, col, value)
  File ""/home/wli/.envs/point-field-bug/lib/python3.6/site-packages/django/db/models/sql/query.py"", line 1084, in build_lookup
    lookup = lookup_class(lhs, rhs)
  File ""/home/wli/.envs/point-field-bug/lib/python3.6/site-packages/django/contrib/gis/db/models/lookups.py"", line 23, in __init__
    super().__init__(lhs, rhs)
  File ""/home/wli/.envs/point-field-bug/lib/python3.6/site-packages/django/db/models/lookups.py"", line 18, in __init__
    self.rhs = self.get_prep_lookup()
  File ""/home/wli/.envs/point-field-bug/lib/python3.6/site-packages/django/db/models/lookups.py"", line 68, in get_prep_lookup
    return self.lhs.output_field.get_prep_value(self.rhs)
  File ""/home/wli/.envs/point-field-bug/lib/python3.6/site-packages/django/contrib/gis/db/models/fields.py"", line 188, in get_prep_value
    raise ValueError('Cannot use object with type %s for a spatial lookup parameter.' % type(obj).__name__)
ValueError: Cannot use object with type NoneType for a spatial lookup parameter.

----------------------------------------------------------------------
Ran 1 test in 0.005s

FAILED (errors=1)
Destroying test database for alias 'default'...

}}}

Workaround:
{{{
Restaurant.objects.extra(where=['location IS NULL'])
}}}"	Bug	closed	GIS	2.0	Release blocker	fixed	PointField GeoDjango	Sergey Fedoseev	Ready for checkin	1	0	0	0	0	0
