mirror of
				https://github.com/django/django.git
				synced 2025-10-30 17:16:10 +00:00 
			
		
		
		
	Fixed #29054 -- Fixed a regression where a queryset that annotates with geometry objects crashes.
Made GEOSGeometryBase hashable.
Regression in 19b2dfd1bf.
Thanks Tim Graham for the review.
			
			
This commit is contained in:
		| @@ -144,6 +144,9 @@ class GEOSGeometryBase(GEOSBase): | ||||
|                 return False | ||||
|         return isinstance(other, GEOSGeometry) and self.srid == other.srid and self.equals_exact(other) | ||||
|  | ||||
|     def __hash__(self): | ||||
|         return hash((self.srid, self.wkt)) | ||||
|  | ||||
|     # ### Geometry set-like operations ### | ||||
|     # Thanks to Sean Gillies for inspiration: | ||||
|     #  http://lists.gispython.org/pipermail/community/2007-July/001034.html | ||||
|   | ||||
| @@ -17,3 +17,6 @@ Bugfixes | ||||
|  | ||||
| * Fixed regression in the use of ``QuerySet.values_list(..., flat=True)`` | ||||
|   followed by ``annotate()`` (:ticket:`29067`). | ||||
|  | ||||
| * Fixed a regression where a queryset that annotates with geometry objects | ||||
|   crashes (:ticket:`29054`). | ||||
|   | ||||
| @@ -3,10 +3,11 @@ from unittest import skipUnless | ||||
| from django.contrib.gis.db.models import F, GeometryField, Value, functions | ||||
| from django.contrib.gis.geos import Point, Polygon | ||||
| from django.db import connection | ||||
| from django.db.models import Count | ||||
| from django.test import TestCase, skipUnlessDBFeature | ||||
|  | ||||
| from ..utils import postgis | ||||
| from .models import City, ManyPointModel | ||||
| from .models import City, ManyPointModel, MultiFields | ||||
|  | ||||
|  | ||||
| class GeoExpressionsTests(TestCase): | ||||
| @@ -48,6 +49,17 @@ class GeoExpressionsTests(TestCase): | ||||
|             obj.refresh_from_db() | ||||
|             self.assertTrue(obj.point3.equals_exact(p1.transform(3857, clone=True), 0.1)) | ||||
|  | ||||
|     def test_multiple_annotation(self): | ||||
|         multi_field = MultiFields.objects.create( | ||||
|             point=Point(1, 1), | ||||
|             city=City.objects.get(name='Houston'), | ||||
|             poly=Polygon(((1, 1), (1, 2), (2, 2), (2, 1), (1, 1))), | ||||
|         ) | ||||
|         qs = City.objects.values('name').annotate( | ||||
|             distance=functions.Distance('multifields__point', multi_field.city.point), | ||||
|         ).annotate(count=Count('multifields')) | ||||
|         self.assertTrue(qs.first()) | ||||
|  | ||||
|     @skipUnlessDBFeature('has_Translate_function') | ||||
|     def test_update_with_expression(self): | ||||
|         city = City.objects.create(point=Point(1, 1, srid=4326)) | ||||
|   | ||||
| @@ -187,6 +187,22 @@ class GEOSTest(SimpleTestCase, TestDataMixin): | ||||
|             self.assertNotEqual(g, {'foo': 'bar'}) | ||||
|             self.assertNotEqual(g, False) | ||||
|  | ||||
|     def test_hash(self): | ||||
|         point_1 = Point(5, 23) | ||||
|         point_2 = Point(5, 23, srid=4326) | ||||
|         point_3 = Point(5, 23, srid=32632) | ||||
|         multipoint_1 = MultiPoint(point_1, srid=4326) | ||||
|         multipoint_2 = MultiPoint(point_2) | ||||
|         multipoint_3 = MultiPoint(point_3) | ||||
|         self.assertNotEqual(hash(point_1), hash(point_2)) | ||||
|         self.assertNotEqual(hash(point_1), hash(point_3)) | ||||
|         self.assertNotEqual(hash(point_2), hash(point_3)) | ||||
|         self.assertNotEqual(hash(multipoint_1), hash(multipoint_2)) | ||||
|         self.assertEqual(hash(multipoint_2), hash(multipoint_3)) | ||||
|         self.assertNotEqual(hash(multipoint_1), hash(point_1)) | ||||
|         self.assertNotEqual(hash(multipoint_2), hash(point_2)) | ||||
|         self.assertNotEqual(hash(multipoint_3), hash(point_3)) | ||||
|  | ||||
|     def test_eq_with_srid(self): | ||||
|         "Testing non-equivalence with different srids." | ||||
|         p0 = Point(5, 23) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user