Sorry for the bad title... I can only explain this with an example,
from django.contrib.gis.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
class BookManager(models.GeoManager):
def get_query_set(self):
return super(BookManager, self).get_query_set().select_related('author')
class Book(models.Model):
name = models.CharField(max_length=100)
author = models.ForeignKey(Author, related_name="books", null=True, blank=True)
objects = BookManager()
>>> Book.objects.create(name='Without Author')
<Book: Book object>
>>> b = Book.objects.get(name='Without Author')
>>> b.author
<Author: Author object>
>>> b.author.name
As you can see, rather than b.author being None, is it an "empty" Author object. This isn't the case when using non-GeoDjango.
What's even weirder is that this only happens when using the GeoManager. If you remove the manager and run the select_related yourself, the following happens,
>>> Book.objects.select_related('author').get(name='Without Author').author
It's None, rather than the "empty" Author from above.
Looks like the row being passed to django.db.models.query.get_cached_row is a list, not a tuple, which causes fields == (None,) * field_count to always fail. Thus obj is instantiated at times it should be set to None.