Browse Source

Fixed #26266 -- Output the primary key in the GeoJSON serializer properties

Thanks Tim Graham for the review.
Claude Paroz 9 years ago
parent
commit
c5517b9e74

+ 3 - 0
django/contrib/gis/serializers/geojson.py

@@ -47,6 +47,9 @@ class Serializer(JSONSerializer):
             "type": "Feature",
             "properties": self._current,
         }
+        if ((self.selected_fields is None or 'pk' in self.selected_fields) and
+                'pk' not in data["properties"]):
+            data["properties"]["pk"] = obj._meta.pk.value_to_string(obj)
         if self._geometry:
             if self._geometry.srid != self.srid:
                 # If needed, transform the geometry in the srid of the global geojson srid

+ 8 - 0
docs/ref/contrib/gis/serializers.txt

@@ -71,3 +71,11 @@ Would output::
         }
       ]
     }
+
+When the ``fields`` parameter is not specified, the ``geojson`` serializer adds
+a ``pk`` key to the ``properties`` dictionary with the primary key of the
+object as the value.
+
+.. versionchanged:: 1.10
+
+    The ``pk`` key was added to the ``properties`` dictionary.

+ 4 - 0
docs/releases/1.10.txt

@@ -131,6 +131,10 @@ Minor features
   :attr:`MultiLineString.closed
   <django.contrib.gis.geos.MultiLineString.closed>` properties.
 
+* The :doc:`GeoJSON serializer </ref/contrib/gis/serializers>` now outputs the
+  primary key of objects in the ``properties`` dictionary if specific fields
+  aren't specified.
+
 :mod:`django.contrib.messages`
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 

+ 3 - 0
tests/gis_tests/geoapp/test_serializers.py

@@ -33,6 +33,8 @@ class GeoJSONSerializerTests(TestCase):
         self.assertEqual(len(geodata['features']), len(City.objects.all()))
         self.assertEqual(geodata['features'][0]['geometry']['type'], 'Point')
         self.assertEqual(geodata['features'][0]['properties']['name'], 'Chicago')
+        first_city = City.objects.all().order_by('name').first()
+        self.assertEqual(geodata['features'][0]['properties']['pk'], str(first_city.pk))
 
     def test_geometry_field_option(self):
         """
@@ -76,6 +78,7 @@ class GeoJSONSerializerTests(TestCase):
         geodata = json.loads(geojson)
         self.assertIn('county', geodata['features'][0]['properties'])
         self.assertNotIn('founded', geodata['features'][0]['properties'])
+        self.assertNotIn('pk', geodata['features'][0]['properties'])
 
     def test_srid_option(self):
         geojson = serializers.serialize('geojson', City.objects.all().order_by('name'), srid=2847)