【问题标题】:How to keep DRY while creating common models in Django?在 Django 中创建通用模型时如何保持 DRY?
【发布时间】:2018-03-15 11:54:21
【问题描述】:

例如,我的 django 应用中有 2 个主要模型:

class Employee(Model):
    name = CharField(max_length=50)

class Client(Model):
    title = CharField(max_length=50)

手机的抽象基类:

class Phone(Model):
    number = CharField(max_length=10)
    class Meta:
        abstract = True

为员工和客户继承单独的类:

class EmployeePhone(Phone):
    employee = ForeignKey(Employee, on_delete=CASCADE, related_name='employee_phones')

class ClientPhone(Phone):
    client = ForeignKey(Client, on_delete=CASCADE, related_name='client_phones')

它有效,但我不喜欢它,我宁愿只保留一个电话模型而不是 3 个。我知道我可以使用通用模型,但不幸的是,这不再是一种选择,因为我的应用程序实际上是 REST-API在创建父对象时创建通用对象似乎是不可能的。那么有没有什么办法可以让东西保持干净和干燥呢?

【问题讨论】:

  • 我不认为湿度问题是关于 SO 的话题。 ;-) 但说真的:请更具体地说明您在哪里看到问题以及您认为更好的解决方案是什么样的。
  • 我想我已经表达了一个明确的观点:“那么有什么解决方案可以保持清洁和干燥吗?”

标签: python django dry


【解决方案1】:

其他答案提供了如何规范化数据库的好主意,但如果您想保持架构相同并避免在代码中重复相同的内容,也许 custom field subclass 是您所追求的?

例子:

# fields.py
class PhoneField(models.CharField):
    def __init__(self, **kwargs):
        kwargs.setdefault('max_length', 50)
        ...
        super().__init__(**kwargs)

# models.py
class Employee(models.Model):
    phone = PhoneField()

【讨论】:

  • 这不是我想要的,但它会很有用。谢谢!
【解决方案2】:

如何保留 1 个电话类并通过外键将员工和客户链接到电话并删除摘要:)。

【讨论】:

    【解决方案3】:

    EmployeePhone (ClientPhone) 作为ManyToManyField 移动到与Phone 模型相关的Employee (Client) 模型中怎么样?

    class Employee(Model):
        name = CharField(max_length=50)
        phones = ManyToManyField(Phone, ...)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      • 2010-11-08
      • 1970-01-01
      • 2011-07-04
      • 2012-04-18
      相关资源
      最近更新 更多