Still not sure what was causing this error, but I got around it by writing my own SQL code in a method:
from django.db import models, connection, transaction
from math import sin, cos, radians, acos
class ZipDistance(models.Model):
zipcode = models.CharField(max_length=5, unique=True)
state_short = models.CharField(max_length=2)
latitude = models.FloatField()
longitude = models.FloatField()
province = models.CharField(max_length=50)
state_long = models.CharField(max_length=20)
def get_zips_within(self, dist):
cursor = connection.cursor()
cursor.execute("""SELECT id, (
3959 * acos( cos( radians(%s) ) * cos( radians( latitude ) ) *
cos( radians( longitude ) - radians(%s) ) + sin( radians(%s) ) *
sin( radians( latitude ) ) ) )
AS distance FROM myapp_zipdistance
HAVING distance <= %s""",
[self.latitude, self.longitude, self.latitude, dist])
ids = [row[0] for row in cursor.fetchall()]
return ZipDistance.objects.filter(id__in=ids)
Now, all I have to do to get a list of zipcodes within a certain distance is the following:
>>> zip1 = ZipDistance.objects.get(zipcode='20001')
>>> zip_list = zip1.get_zips_within(dist=100)
This gives me a list of all the zipcodes in my database within 100 miles of Washington D.C. (zipcode 20001)