Index: django/contrib/gis/tests/distapp/models.py
===================================================================
--- django/contrib/gis/tests/distapp/models.py	(revision 7176)
+++ django/contrib/gis/tests/distapp/models.py	(working copy)
@@ -10,7 +10,7 @@
 class AustraliaCity(models.Model):
     "City model for Australia, using WGS84."
     name = models.CharField(max_length=30)
-    point = models.PointField()
+    point = models.PointField(distance_spheroid=True)
     objects = models.GeoManager()
     def __unicode__(self): return self.name
 
Index: django/contrib/gis/db/models/fields/__init__.py
===================================================================
--- django/contrib/gis/db/models/fields/__init__.py	(revision 7176)
+++ django/contrib/gis/db/models/fields/__init__.py	(working copy)
@@ -25,7 +25,8 @@
     # Geodetic units.
     geodetic_units = ('Decimal Degree', 'degree')
 
-    def __init__(self, srid=4326, spatial_index=True, dim=2, **kwargs):
+    def __init__(self, srid=4326, spatial_index=True, dim=2, 
+                 distance_spheroid=False, **kwargs):
         """
         The initialization function for geometry fields.  Takes the following
         as keyword arguments:
@@ -41,6 +42,13 @@
                   
         dim:
          The number of dimensions for this geometry.  Defaults to 2.
+
+        distance_spheroid:
+         When geodetic distance calculations are performed on the geometries
+         for this field, the `ST_distance_spheroid` function will be used instead 
+         of `ST_distance_sphere`.  In other words, geodetic distance operations 
+         will be more accurate at the expense of speed. Only affects PostGIS
+         spatial backends.
         """
 
         # Setting the index flag with the value of the `spatial_index` keyword.
@@ -72,6 +80,9 @@
             # (both required for distance queries).
             self._unit, self._unit_name = SpatialRefSys.get_units(srs_wkt)
             self._spheroid = SpatialRefSys.get_spheroid(srs_wkt)
+            self._distance_spheroid = distance_spheroid
+        else:
+            self._unit, self._unit_name, self._sphere_distance = None, None, None
 
         # Setting the dimension of the geometry field.
         self._dim = dim
@@ -79,6 +90,15 @@
         super(GeometryField, self).__init__(**kwargs) # Calling the parent initializtion function
 
     ### Routines specific to GeometryField ###
+    @property
+    def geodetic(self):
+        """
+        Property that tells if the coordinate system for this GeometryField
+        is geographic in nature (e.g., uses lat/lon instead of projected
+        units).
+        """
+        return self._unit_name in self.geodetic_units
+        
     def get_distance(self, dist):
         """
         Returns a distance number in units of the field.  For example, if 
@@ -87,7 +107,7 @@
         """
         
         if isinstance(dist, Distance):
-            if self._unit_name in self.geodetic_units:
+            if self.geodetic:
                 # Spherical distance calculation parameter should be in meters.
                 dist_param = dist.m
             else:
@@ -97,7 +117,7 @@
             dist_param = dist
 
         # Sphereical distance query; returning meters.
-        if SpatialBackend.name == 'postgis' and self._unit_name in self.geodetic_units:
+        if (SpatialBackend.name == 'postgis' and self.geodetic and self._distance_spheroid):
             return [gqn(self._spheroid), dist_param]
         else:
             return [dist_param]
Index: django/contrib/gis/db/models/query.py
===================================================================
--- django/contrib/gis/db/models/query.py	(revision 7176)
+++ django/contrib/gis/db/models/query.py	(working copy)
@@ -284,7 +284,7 @@
             tolerance = kwargs.get('tolerance', 0.05)
             dist_select = {'distance' : '%s(%s, %s, %s)' % (DISTANCE, geo_col, where[0], tolerance)}
         else:
-            if len(where) == 3:
+            if geo_field.geodetic:
                 # Spherical distance calculation was requested (b/c spheroid 
                 # parameter was attached) However, the PostGIS ST_distance_spheroid() 
                 # procedure may only do queries from point columns to point geometries
@@ -295,7 +295,10 @@
                     raise TypeError('Spherical distance calculation only supported with Point Geometry parameters')
 
                 # Call to distance_spheroid() requires the spheroid as well.
-                dist_sql = '%s(%s, %s, %s)' % (SpatialBackend.distance_spheroid, geo_col, where[0], where[1])
+                if len(where) == 3:
+                    dist_sql = '%s(%s, %s, %s)' % (SpatialBackend.distance_spheroid, geo_col, where[0], where[1])
+                else:
+                    dist_sql = '%s(%s, %s)' % (SpatialBackend.distance_sphere, geo_col, where[0])
             else:
                 dist_sql = '%s(%s, %s)' % (DISTANCE, geo_col, where[0])
             dist_select = {'distance' : dist_sql}
Index: django/contrib/gis/db/backend/__init__.py
===================================================================
--- django/contrib/gis/db/backend/__init__.py	(revision 7176)
+++ django/contrib/gis/db/backend/__init__.py	(working copy)
@@ -22,7 +22,7 @@
 from django.contrib.gis.db.backend.util import gqn
 
 # These routines (needed by GeoManager), default to False.
-ASGML, ASKML, DISTANCE, DISTANCE_SPHEROID, EXTENT, TRANSFORM, UNION, VERSION = tuple(False for i in range(8))
+ASGML, ASKML, DISTANCE, DISTANCE_SPHERE, DISTANCE_SPHEROID, EXTENT, TRANSFORM, UNION, VERSION = tuple(False for i in range(9))
 
 # Lookup types in which the rest of the parameters are not 
 # needed to be substitute in the WHERE SQL (e.g., the 'relate'
@@ -39,8 +39,8 @@
     from django.contrib.gis.db.backend.postgis.creation import create_spatial_db
     from django.contrib.gis.db.backend.postgis.query import \
         get_geo_where_clause, POSTGIS_TERMS as GIS_TERMS, \
-        ASGML, ASKML, DISTANCE, DISTANCE_SPHEROID, DISTANCE_FUNCTIONS, \
-        EXTENT, GEOM_SELECT, TRANSFORM, UNION, \
+        DISTANCE, DISTANCE_SPHERE, DISTANCE_SPHEROID, DISTANCE_FUNCTIONS, \
+        ASGML, ASKML, EXTENT, GEOM_SELECT, TRANSFORM, UNION, \
         MAJOR_VERSION, MINOR_VERSION1, MINOR_VERSION2
     # PostGIS version info is needed to determine calling order of some
     # stored procedures (e.g., AsGML()).
@@ -76,6 +76,7 @@
     as_kml = ASKML
     as_gml = ASGML
     distance = DISTANCE
+    distance_sphere = DISTANCE_SPHERE
     distance_spheroid = DISTANCE_SPHEROID
     extent = EXTENT
     name = SPATIAL_BACKEND
Index: django/contrib/gis/db/backend/postgis/query.py
===================================================================
--- django/contrib/gis/db/backend/postgis/query.py	(revision 7176)
+++ django/contrib/gis/db/backend/postgis/query.py	(working copy)
@@ -40,6 +40,7 @@
     ASKML = get_func('AsKML')
     ASGML = get_func('AsGML')
     DISTANCE = get_func('Distance')
+    DISTANCE_SPHERE = get_func('distance_sphere')
     DISTANCE_SPHEROID = get_func('distance_spheroid')
     EXTENT = get_func('extent')
     GEOM_FROM_TEXT = get_func('GeomFromText')
@@ -82,14 +83,22 @@
 
 class PostGISSphereDistance(PostGISFunction):
     "For PostGIS spherical distance operations."
-    dist_func = 'distance_spheroid'
+    dist_func = 'distance_sphere'
     def __init__(self, operator):
         # An extra parameter in `end_subst` is needed for the spheroid string.
-        super(PostGISSphereDistance, self).__init__(self.dist_func, 
-                                                    beg_subst='%s(%s, %%s, %%s', 
-                                                    end_subst=') %s %s',
+        super(PostGISSphereDistance, self).__init__(self.dist_func, end_subst=') %s %s',
                                                     operator=operator, result='%%s')
 
+class PostGISSpheroidDistance(PostGISFunction):
+    "For PostGIS spherical distance operations."
+    dist_func = 'distance_spheroid'
+    def __init__(self, operator):
+        # An extra parameter in `end_subst` is needed for the spheroid string.
+        super(PostGISSpheroidDistance, self).__init__(self.dist_func, 
+                                                      beg_subst='%s(%s, %%s, %%s', 
+                                                      end_subst=') %s %s',
+                                                      operator=operator, result='%%s')
+
 class PostGISRelate(PostGISFunctionParam):
     "For PostGIS Relate(<geom>, <pattern>) calls."
     pattern_regex = re.compile(r'^[012TF\*]{9}$')
@@ -162,9 +171,9 @@
 
 # Valid distance types and substitutions
 dtypes = (Decimal, Distance, float, int, long)
-def get_dist_ops(operator):
+def get_dist_ops(op):
     "Returns operations for both regular and spherical distances."
-    return (PostGISDistance(operator), PostGISSphereDistance(operator))
+    return (PostGISDistance(op), PostGISSphereDistance(op), PostGISSpheroidDistance(op))
 DISTANCE_FUNCTIONS = {
     'distance_gt' : (get_dist_ops('>'), dtypes),
     'distance_gte' : (get_dist_ops('>='), dtypes),
@@ -228,13 +237,17 @@
             if lookup_type == 'relate': 
                 op = op(value[1])
             elif lookup_type in DISTANCE_FUNCTIONS and lookup_type != 'dwithin':
-                if field._unit_name == 'degree':
+                if field.geodetic:
                     # Geodetic distances are only availble from Points to PointFields.
                     if field._geom != 'POINT':
                         raise TypeError('PostGIS spherical operations are only valid on PointFields.')
                     if value[0].geom_typeid != 0:
                         raise TypeError('PostGIS geometry distance parameter is required to be of type Point.')
-                    op = op[1]
+                    
+                    # If the GeometryField `distance_spheroid` keyword is set, then
+                    # `ST_distance_spheroid` is used instead.
+                    if field._distance_spheroid: op = op[2]
+                    else: op = op[1]
                 else:
                     op = op[0]
         else:
