Python-Django-通用字段模型设计

时间:2018-07-30 19:28:13

标签: python django architecture software-design

我需要一些想法来解决以下问题,也许可以采用某些设计模式或当前体系结构中的另一种方法。

我的应用程序的后端完全在Django框架中开发,并且有五个当前模型(无论它们之间的关系如何):

  • 产品(id,产品名称,产品类别,产品代码)
  • 客户(id,客户名称)
  • 帐户(ID,帐户代码,帐户名)
  • 城市(id,city_name)
  • 用户(ID,电子邮件,用户名)

首先,我需要添加一个新模型,以上述方式的任何可能组合动态轻松地创建事务:

  • 示例1:交易(id,产品,客户,年,月,金额)
  • 示例2:交易(id,帐户,年,月,金额)
  • 示例3:交易(id,帐户,城市,年,月,金额)
  • 示例N:交易(id,产品,用户,年,月,月额

如您所见,我的交易模型有几个静态字段(年,月,金额),但其他字段取决于用例的随机定制。

我曾经考虑过类似Transaction(id,dynamic_field_1,dynamic_field_2,dynamic_field_3,year,amount)的方法,但是如何动态地进行呢?有某种设计模式或正确的方法可以做到这一点吗?

此外,我需要这些字段已经通过先前的模型进行了验证。例如:

交易(id,产品,客户,年,月,量):

  • 验证产品是否存在于数据库中
  • 验证客户是否存在于数据库中

我该怎么做?

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您可以在添加事务类型时修复源代码,那么我认为性能最好
您可以使用空值使每个可能的列都具有事务模型,并且在创建新事务时,可以验证有关所需字段的isNull。

class Transaction(models.Model):
    transaction_id = models.AutoField(primary_key=True)
    transaction_product = models.ForeignKey('Product', on_delete=models.CASCADE, blank=True, null=False)
    transaction_customer = models.ForeignKey('Customer', on_delete=models.CASCADE, blank=True, null=False)
    transaction_year = models.CharField(max_length=32, null=True, blank=True, db_index=True)
    transaction_month = models.CharField(max_length=32, null=True, blank=True, db_index=True)
    ...
    ...

如果您需要在Web管理页面上添加交易类型
我认为您可以使TransactionExtra模型与Transaction有很多很多的关系。这样。

class Transaction(models.Model):
    transaction_id = models.AutoField(primary_key=True)
    transaction_extra = models.ManyToManyField('TransactionExtra', db_index=True)

class TransactionExtra(models.Model):
    transaction_extra_id = models.AutoField(primary_key=True)
    transaction_extra_name = models.CharField(max_length=32, index=True)
    transaction_extra_value = models.CharField(max_length=512)