1. from django.contrib.gis.db import models
    
  2. 
    
  3. from ..utils import gisfield_may_be_null
    
  4. 
    
  5. 
    
  6. class NamedModel(models.Model):
    
  7.     name = models.CharField(max_length=30)
    
  8. 
    
  9.     class Meta:
    
  10.         abstract = True
    
  11. 
    
  12.     def __str__(self):
    
  13.         return self.name
    
  14. 
    
  15. 
    
  16. class Country(NamedModel):
    
  17.     mpoly = models.MultiPolygonField()  # SRID, by default, is 4326
    
  18. 
    
  19. 
    
  20. class CountryWebMercator(NamedModel):
    
  21.     mpoly = models.MultiPolygonField(srid=3857)
    
  22. 
    
  23. 
    
  24. class City(NamedModel):
    
  25.     point = models.PointField()
    
  26. 
    
  27.     class Meta:
    
  28.         app_label = "geoapp"
    
  29. 
    
  30. 
    
  31. # This is an inherited model from City
    
  32. class PennsylvaniaCity(City):
    
  33.     county = models.CharField(max_length=30)
    
  34.     founded = models.DateTimeField(null=True)
    
  35. 
    
  36.     class Meta:
    
  37.         app_label = "geoapp"
    
  38. 
    
  39. 
    
  40. class State(NamedModel):
    
  41.     poly = models.PolygonField(
    
  42.         null=gisfield_may_be_null
    
  43.     )  # Allowing NULL geometries here.
    
  44. 
    
  45.     class Meta:
    
  46.         app_label = "geoapp"
    
  47. 
    
  48. 
    
  49. class Track(NamedModel):
    
  50.     line = models.LineStringField()
    
  51. 
    
  52. 
    
  53. class MultiFields(NamedModel):
    
  54.     city = models.ForeignKey(City, models.CASCADE)
    
  55.     point = models.PointField()
    
  56.     poly = models.PolygonField()
    
  57. 
    
  58. 
    
  59. class UniqueTogetherModel(models.Model):
    
  60.     city = models.CharField(max_length=30)
    
  61.     point = models.PointField()
    
  62. 
    
  63.     class Meta:
    
  64.         unique_together = ("city", "point")
    
  65.         required_db_features = ["supports_geometry_field_unique_index"]
    
  66. 
    
  67. 
    
  68. class Truth(models.Model):
    
  69.     val = models.BooleanField(default=False)
    
  70. 
    
  71. 
    
  72. class Feature(NamedModel):
    
  73.     geom = models.GeometryField()
    
  74. 
    
  75. 
    
  76. class MinusOneSRID(models.Model):
    
  77.     geom = models.PointField(srid=-1)  # Minus one SRID.
    
  78. 
    
  79. 
    
  80. class NonConcreteField(models.IntegerField):
    
  81.     def db_type(self, connection):
    
  82.         return None
    
  83. 
    
  84.     def get_attname_column(self):
    
  85.         attname, column = super().get_attname_column()
    
  86.         return attname, None
    
  87. 
    
  88. 
    
  89. class NonConcreteModel(NamedModel):
    
  90.     non_concrete = NonConcreteField()
    
  91.     point = models.PointField(geography=True)
    
  92. 
    
  93. 
    
  94. class ManyPointModel(NamedModel):
    
  95.     point1 = models.PointField()
    
  96.     point2 = models.PointField()
    
  97.     point3 = models.PointField(srid=3857)