Обновление поля 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"))

Как бы вы это сделали?

Вернуться на верх