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