在 Django 中创建通用模型时如何保持 DRY?

How to keep DRY while creating common models in Django?

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

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

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

手机的抽象基础 class:

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

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

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

它有效,但我不喜欢它,我宁愿只保留一个 Phone 模型而不是 3 个。我知道我可以使用通用模型,但不幸的是,这不再是一种选择,因为我的app 实际上是 REST-API 并且在创建 Parent-Object 的同时创建 Generic-Object 似乎是不可能的。那么有什么解决办法可以让东西保持干净和干燥吗?

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

如何将 EmployeePhone (ClientPhone) 作为 Employee (Client) 模型中的 ManyToManyField 移动到 Phone 模型?

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

其他答案提出了如何规范化数据库的好主意,但如果您想保持模式相同并且只是避免在代码中重复相同的事情,也许 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()