Django - Как настроить 2 модели с одинаковыми полями? - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть приложение по недвижимости с 20-летней историей продаж. Я хочу поместить последние 2 года списков в модель, которая будет активно запрашиваться, а остальные 18 лет - в архивированную модель.

Я использую Django 1.11 с Postgresql 9.5

Мои ограниченные знания в области управления базами данных говорят мне, что это называется «горизонтальным разделением» или «разделением». Есть ли умный способ настроить это в Django? Или просто скопировать и вставить одинаковые имена полей в ListingActive и ListingArchive?

class ListingActive(models.Model):
    data1 = models.IntegerField()
    data2 = models.CharField(max_length=10)
    ...
    data100 = models.CharField(max_length=20)

class ListingArchived(models.Model):
    same fields as ListingActive

Дополнительный вопрос. Я хочу выполнить горизонтальное разбиение и вертикальное разбиение.

Предполагается, что в каждой модели Listing всего 100 полей, но только 10 из них активно запрашиваются. Остальные 90 полей являются подробностями отображения, которые никогда не запрашиваются.

В конце я хочу иметь 4 модели, показанные ниже. Есть ли способ использовать абстрактные модели или другой метод для его настройки?

class ListingActiveQuery(models.Model):
    actively_queried_data_1 = models.IntegerField()
    actively_queried_data_2 = models.IntegerField()
    ...
    actively_queried_data_10 = models.IntegerField()
    details = models.OneToOneField(ListingActiveDetails)

class ListingActiveDetails(models.Model):
    data_1 = models.IntegerField()
    data_2 = models.IntegerField()
    ...
    data_90 = models.IntegerField()

class ListingArchivedQuery(models.Model):
    actively_queried_data_1 = models.IntegerField()
    actively_queried_data_2 = models.IntegerField()
    ...
    actively_queried_data_10 = models.IntegerField()
    details = models.OneToOneField(ListingArchivedDetails)

class ListingArchivedDetails(models.Model):
    data_1 = models.IntegerField()
    data_2 = models.IntegerField()
    ...
    data_90 = models.IntegerField()

1 Ответ

0 голосов
/ 03 ноября 2018

Обычно вы создаете абстрактную модель [Django-doc] с полями, а затем создаете подкласс этой абстрактной модели в двух реальных моделях. Например:

class <b>AbstractDataModel</b>(models.Model):
    data1 = models.IntegerField()
    data2 = models.CharField(max_length=10)
    # ...
    data100 = models.CharField(max_length=20)

    class Meta:
        <b>abstract = True</b>

class ListingActive(<b>AbstractDataModel</b>):
    pass

class ListingArchived(<b>AbstractDataModel</b>):
    pass

EDIT

class AbstractQuery(models.Model):
    actively_queried_data_1 = models.IntegerField()
    actively_queried_data_2 = models.IntegerField()
    # ...
    actively_queried_data_10 = models.IntegerField()

    class Meta:
        abstract = True

class AbstractDetails(models.Model):
    data_1 = models.IntegerField()
    data_2 = models.IntegerField()
    # ...
    data_90 = models.IntegerField()

    class Meta:
        abstract = True

class ListingActiveQuery(AbstractQuery):
    details = models.OneToOneField(ListingActiveDetails)

class ListingActiveDetails(AbstractDetails):
    pass

class ListingArchivedQuery(AbstractQuery):
    details = models.OneToOneField(ListingArchivedDetails)

class ListingArchivedDetails(AbstractDetails):
    pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...