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

问题描述 投票:1回答:1

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

我在Postgresql 9.5中使用Django 1.11

我有限的数据库管理知识告诉我这称为“水平分区”或“分片”。有没有一种聪明的方法在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()
django postgresql
1个回答
3
投票

通常,您使用字段创建abstract model [Django-doc],然后将该抽象模型子类化为两个真实模型。例如:

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

    class Meta:
        abstract = True

class ListingActive(AbstractDataModel):
    pass

class ListingArchived(AbstractDataModel):
    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
© www.soinside.com 2019 - 2024. All rights reserved.