Django - 如何设置两个具有相同字段的模型?

标签 django postgresql

我有一个拥有 20 年销售历史的房地产应用程序。我想将最近 2 年的列表放入一个将被主动查询的模型中,将另外 18 年的列表放入一个存档模型中。

我正在使用 Django 1.11 和 Postgresql 9.5

我有限的数据库管理知识告诉我这称为“水平分区”或“分片”。有没有一种聪明的方法可以在 Django 中进行设置?或者我是否只需将相同的字段名称复制并粘贴到 ListingActiveListingArchive 中?

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()

最佳答案

通常您会创建一个 abstract model [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

编辑

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

关于Django - 如何设置两个具有相同字段的模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53134418/

相关文章:

javascript - 将 Python 代码合并到 JavaScript Web 应用程序中

django - 我正在尝试对 Django 1.6 数据集执行过滤、计数和排序

postgresql - 无法使用bindValue、Postgresql 绑定(bind)Doctrine DBAL 中的字符串值

postgresql - 如何按列排序但数组排在第一位

json - 如何在 Postgres 中将查询结果转换为 JSON 对象

带有自定义图像单元格的 django-tables2

python - Django:自定义模板标签,需要 2 个变量

python - 如何扩展 Django "login"表单?

postgresql - 使用 prisma 和 postgres 的行级安全性

sql - 如何从数据库中选择重叠值对