Джанго 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, но я надеюсь, что сравнение этих (или других) примеров кода с точки зрения производительности и удобства обслуживания делает этот вопрос ответственным, а не просто обсуждаемым?)
Спасибо!