【问题标题】:Python - Django - Generic Fields Model designPython - Django - 通用字段模型设计
【发布时间】:2019-01-07 02:52:44
【问题描述】:

我需要一些想法来解决以下问题,可能是我当前架构中的一些设计模式或其他方法。

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

  • 产品(id、product_name、product_category、product_code)
  • 客户(id, customer_name)
  • 帐户(id、account_code、account_name)
  • 城市(id, city_name)
  • 用户(ID、电子邮件、用户名)

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

  • 示例 1:交易(id、产品、客户、年、月、金额)
  • 示例 2:交易(id、账户、年、月、金额)
  • 示例 3:交易(id、账户、城市、年、月、金额)
  • 示例 N:事务(id、product、user、year、month、anount)

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

我想过像 Transaction(id, dynamic_field_1, dynamic_field_2, dynamic_field_3, year, amount) 之类的东西,但我怎样才能动态实现呢?是否有一些设计模式或正确的方法来做到这一点?

此外,我需要这些字段已经从以前的模型中得到验证。例如:

交易(id、产品、客户、年、月、金额):

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

我怎样才能采用这种方法?

谢谢!

【问题讨论】:

标签: python django architecture software-design


【解决方案1】:

如果在添加事务类型时可以修复源代码,我认为性能是最好的
您可以使用可为空的每个可能的列创建事务模型,并且在创建新事务时,您可以验证所需字段的 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)
    ...
    ...

如果您需要在网页管理页面添加交易类型
我认为您可以使 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)

【讨论】:

    猜你喜欢
    • 2010-10-10
    • 2016-10-12
    • 2019-02-04
    • 1970-01-01
    • 2021-07-30
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多