在我的应用程序中,可以将许多不同类型的Record
映射到Person
。在我的初始实现中,我使每个记录都从一个抽象基类继承,并使用GenericRelation
来管理整个事物。代码有点复杂,但它有效:
models.py
class Person(models.Model):
...
class PersonRecordMapping(models.Model):
person = models.ForeignKey(Person)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
class RecordParent(models.Model):
people = GenericRelation(PersonRecordMapping)
class Meta:
abstract = True
class RecordA(RecordParent):
w = ...
x = ...
class RecordB(RecordParent):
y = ...
z = ...
等等。 (正如我试图指出的那样,每种类型的Record
都与其他类型完全不同,每种模型都有非常不同的字段。)
当我围绕这些模型构建应用程序时,我开始怀疑这种方法是否会扩展,因为我最终会有一些RecordX
类型的类。我开始考虑如何在一个表中获取所有Record
,其中一列指示每个Record
的类型,并最终发现新的JSONField
。乍一看,它似乎正是我想要简化整个事情。
class PersonRecordMapping(models.Model):
person = models.ForeignKey(Person)
record = models.ForeignKey(Record)
class Record(models.Model):
type = models.ForeignKey(RecordType) # New model to identify whether a RecordA, RecordB, &c.
data = JSONField()
所有这些看起来都很好,直到我通过将模型字段转换为JSON属性来实现了多少功能,因为JSON中的数据是用户输入的,所以功能非常重要。
data = JSONField(validators=[something???])
那样,但从我可以说的这个实现并不适用于validator
取决于Record.type
的值的情况。所以 - 我正在寻找洞察这种情况的最佳架构,平衡性能而不必使代码库不必要地复杂化。或者,是否有其他方法可以解决这种情况?
(我知道这不是理想的StackOverflow问题,但我希望根据性能和可维护性来评估这些(或其他)代码示例,这使得这个问题可以回答,而不仅仅是可讨论的?)
谢谢!