Django GenericRelation与JSONField

时间:2017-01-16 23:47:36

标签: django django-jsonfield django-generic-relations

在我的应用程序中,可以将许多不同类型的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中的数据是用户输入的,所以功能非常重要。

  • 我无法轻松验证JSON中的数据条目。显然我可以像data = JSONField(validators=[something???])那样,但从我可以说的这个实现并不适用于validator取决于Record.type的值的情况。
  • 即使我能解决这个问题,我也会失去个别字段的干净管理界面。是的,我想我可以使用自定义保存功能制作自定义表单,但这看起来相当麻烦。

所以 - 我正在寻找洞察这种情况的最佳架构,平衡性能而不必使代码库不必要地复杂化。或者,是否有其他方法可以解决这种情况?

(我知道这不是理想的StackOverflow问题,但我希望根据性能和可维护性来评估这些(或其他)代码示例,这使得这个问题可以回答,而不仅仅是可讨论的?)

谢谢!

0 个答案:

没有答案