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

时间:2018-03-15 11:54:22

标签: python django dry

例如,我的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

为Employee和Client继承了单独的类:

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.我知道我可以使用Generic-Models但不幸的是,这不再是一个选项,因为我的应用程序实际上是REST-API并且在创建Parent-Object时似乎无法创建Generic-Object。那么有什么解决方案可以保持干净和干燥吗?

3 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如何将EmployeePhoneClientPhone)作为与Employee模型相关的ClientPhone)模型中的ManyToManyField移动?

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