Обновление поля geodjango после вычисления поверхности
У меня есть база данных со списком зданий в нескольких областях. Я хочу обновить все экземпляры районов одновременно с плотностью застройки.
Вот мои модели:
class Area(models.Model):
mpoly = models.MultiPolygonField()
surface = models.DecimalField(max_digits=8, decimal_places=2)
density = models.DecimalField(max_digits=3, decimal_places=2)
class Building(models.Model):
mpoly = models.MultiPolygonField()
Вот мой код (но он не работает):
sub_qs = Building.objects.filter(mpoly__intersects=OuterRef("mpoly"))
sub_qs = sub_qs.annotate(
intersection=Intersection("mpoly", OuterRef("mpoly")),
intersection_area=Area(Transform("intersection", 2154)),
)
sub_qs = sub_qs.aggregate(Sum("intersection_area"))
Area.objects.all().annotate(
surface_built=Cast(
Subquery(sub_qs[:1]),
DecimalField(max_digits=3, decimal_places=2)
)
).update(density=F("surface_built")/F("surface"))
Как бы вы это сделали?