Чтобы расширить ответ pawartur, есть несколько способов обработки нескольких (возможно сложных) типов данных для полей. Один из способов, которым вы можете попытаться, - это использовать наследование модели, возможно, что-то вроде этого:
class FieldContent(models.Model):
field = models.ForeignKey(Field)
content_object = models.ForeignKeyKey(ContentObject)
def get_component(self):
"""Return the specific component instance for this field."""
return self.field.get_object_for_this_type(pk=self.pk)
Затем вы наследуете от этой базовой модели для каждого компонента типа поля, например:
class SomeComponent(FieldContent):
# specific fields for the component here
Затем вы можете делать такие вещи, как:
somecontentobject.get (ID = любой) .fieldcontent_set.get (независимо) .get_component (). specific_component_field
Чтобы создать новые экземпляры полей, вы можете захотеть добавить вспомогательный метод в модель поля, например:
def create_content(self, content_object):
return self.component.get_class().objects.create(
content_object=content_object, field=self)
Одна вещь, на которую стоит обратить внимание, это то, что все эти вещи обычно приводят к тому, что вы боретесь с фреймворком, места, где Django делал все для вас (формы, администратор и т. Д.), Внезапно становятся чем-то вроде работы, чтобы разобраться , Возможно, стоит взглянуть на то, как некоторые реальные проекты справляются с этим, Django-cms (django-cms.org), вероятно, является хорошим началом.
Просто предупреждение: я не проверял ни один код в этом посте, поскольку я не за компьютером, на котором установлено что-либо полезное, но в целом все должно быть в порядке.