Джанго GenericRelation против JSONField

В моем приложении ряд различных видов Record s может быть сопоставлен с 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 s в одной таблице со столбцом, указывающим, какой вид 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,
  • Даже если бы я мог понять это, я бы потерял чистый интерфейс администратора для отдельных полей. Да, я думаю, я мог бы создавать собственные формы с пользовательскими функциями сохранения, но это кажется довольно громоздким.

Итак - я ищу понимание того, что является лучшей архитектурой для этого случая, балансируя производительность без ненужного усложнения базы кода. Или есть какой-то другой подход к этой ситуации, о котором я не знаю?

(Я знаю, что это не идеальный вопрос Stackru, но я надеюсь, что сравнение этих (или других) примеров кода с точки зрения производительности и удобства обслуживания делает этот вопрос ответственным, а не просто обсуждаемым?)

Спасибо!

0 ответов

Другие вопросы по тегам