で ForeignKey フィールドにフィルターをかけると__isnull=True
、次の例外が発生します。
DatabaseError: This query is not supported by the database.
ただし、__isnull=False
ForeignKey は、他の不等式フィルターがない限り機能します (これは私が期待することです)。また__isnull=True
、他のフィールド タイプでも機能します。
__isnull=True
では、 ForeignKey で機能しないのはなぜですか? ここDBIndexer
に示すように機能させようとしているようです:
https://github.com/django-nonrel/django-dbindexer/blob/dbindexer-1.4/dbindexer/backends.py
ただし、djangotoolbox には例外があります。
File "/Users//Documents/workspace/-gae-dev/src/django/db/models/query.py", line 107, in _result_iter
self._fill_cache()
File "/Users//Documents/workspace/-gae-dev/src/django/db/models/query.py", line 774, in _fill_cache
self._result_cache.append(self._iter.next())
File "/Users//Documents/workspace/-gae-dev/src/django/db/models/query.py", line 275, in iterator
for row in compiler.results_iter():
File "/Users//Documents/workspace/-gae-dev/src/djangotoolbox/db/basecompiler.py", line 337, in results_iter
results = self.build_query(fields).fetch(
File "/Users//Documents/workspace/-gae-dev/src/djangotoolbox/db/basecompiler.py", line 428, in build_query
self.check_query()
File "/Users//Documents/workspace/-gae-dev/src/djangotoolbox/db/basecompiler.py", line 409, in check_query
raise DatabaseError("This query is not supported by the database.")
djangoappengine で次のコメントアウトされたテスト ケースに遭遇しましたが、同じ問題を参照しているのかどうか疑問に思っています。
def test_is_null(self):
self.assertEquals(FieldsWithOptionsModel.objects.filter(
floating_point__isnull=True).count(), 0)
FieldsWithOptionsModel(
integer=5.4, email='shinra.tensai@sixpaths.com',
time=datetime.datetime.now().time()).save()
self.assertEquals(FieldsWithOptionsModel.objects.filter(
floating_point__isnull=True).count(), 1)
# XXX: These filters will not work because of a Django bug.
# self.assertEquals(FieldsWithOptionsModel.objects.filter(
# foreign_key=None).count(), 1)
# (it uses left outer joins if checked against isnull)
# self.assertEquals(FieldsWithOptionsModel.objects.filter(
# foreign_key__isnull=True).count(), 1)