Заполнение выпадающего списка из другой таблицы/представления

У меня есть модель сайта, которая связана с муниципалитетом, где расположен сайт. Использование этого муниципалитета в выпадающем поле в форме создания приводит к довольно длительному времени загрузки. Причина заключается в большом количестве муниципалитетов в базе данных, а также в том, что административные единицы связаны друг с другом, что приводит к каскадным запросам для заполнения выпадающего поля.

Есть ли способ ускорить этот процесс? Я думал сделать материализованное представление и использовать его для заполнения выпадающего поля, но это привело бы к ошибке значения, потому что значение из выпадающего поля должно быть экземпляром связанной модели, насколько я знаю. Может быть, есть другой способ сделать так, чтобы форма загружалась быстрее? Или материализованное представление - это то, что нужно, и я просто что-то неправильно понимаю?

class site(models.Model):
    sid = models.AutoField(primary_key=True)
    site_name = models.CharField(max_length=250)
    site_notes = models.CharField(max_length=2500, blank=True, null=True)
    municipality = models.ForeignKey('local_administrative_unit', on_delete=models.PROTECT)
    geom = models.PointField(srid=4326)

class administrative_level_5(models.Model):
    al5_id = models.CharField(primary_key=True, max_length=10)
    al5_name = models.CharField(max_length=150)
    geom = models.MultiPolygonField(srid=4326)

class administrative_level_4(models.Model):
    al4_id = models.IntegerField(primary_key=True)
    al4_name = models.CharField(max_length=150)
    adm_level_5 = models.ForeignKey('administrative_level_5', on_delete=models.PROTECT)
    geom = models.MultiPolygonField(srid=4326)

class administrative_level_3(models.Model):
    al3_id = models.IntegerField(primary_key=True)
    al3_name = models.CharField(max_length=150)
    adm_level_4 = models.ForeignKey('administrative_level_4', on_delete=models.PROTECT)
    geom = models.MultiPolygonField(srid=4326)
    
class administrative_level_2(models.Model):
    al2_id = models.IntegerField(primary_key=True)
    al2_name = models.CharField(max_length=150)
    adm_level_3 = models.ForeignKey('administrative_level_3',on_delete=models.PROTECT)
    geom = models.MultiPolygonField(srid=4326)

class local_administrative_unit(models.Model):
    lau_id = models.IntegerField(primary_key=True)
    lau_name = models.CharField(max_length=150)
    adm_level_2 = models.ForeignKey('administrative_level_2', on_delete=models.PROTECT)
    geom = models.MultiPolygonField(srid=4326)
Вернуться на верх