django: создание модели для персонажа, который может быть писателем, актером или и тем, и другим - PullRequest
1 голос
/ 01 марта 2012

Я новичок в Python и Django, пытаюсь создать базу данных, которая содержит общую информацию о людях, поэтому у меня есть это:

  • модель для Персона (содержит общую информацию).
  • модель для категории, к которой принадлежит человек (человек может быть в нескольких категориях одновременно).

каждая категория содержит свои собственные дополнительные данные (у человека, который находится в категории "Авторы", могут быть книги, которые мы хотим сохранить в БД)

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

другая мысль - создание профилей, которые имеют отношение OneToOne к модели Person, но я не уверен, что это лучший способ

Каков наилучший / другие способы решения этой проблемы?

Ответы [ 3 ]

2 голосов
/ 01 марта 2012

Похоже, вы хотите, чтобы каждая категория имела от ForeignKey до Person.

1 голос
/ 01 марта 2012

добавить ManyToManyField(Category) в класс Person.

Разрешения Django в модели User решаются одинаково (через класс Group)

редактирование:

Вы правы, извините за мой бесполезный ответ.

Мое решение будет выглядеть так:

Class Person(Model):

   @property
   def extras(self):
      extra_data = {}
      for category in self.categories.all():
          category_model_class = CATEGORIES_DATA_MAP[category.name]
          extra_data[category.name] = category_model_class.objects.filter(user=self.pk)

      return extra_data

... где CATEGORIES_DATA_MAP - словарь с картой отношений категории / модели

0 голосов
/ 01 марта 2012

Множество 1 к 1 отн. - это путь.

Определите модель ActorProfile, модель WriterProfile и т. Д., Каждая из которых имеет fk для пользователя. При необходимости используйте магию орма для загрузки.

Принципиально, что FK находится в модели профиля, в противном случае вам нужно будет добавлять новый столбец в пользовательскую таблицу каждый раз, когда вам нужен новый вид профиля.

Поскольку профили, вероятно, будут несколько перекрываться, я бы предложил использовать композицию (вместо наследования), создать больше типов профилей, в которых хранятся общие данные, и сохранить конкретные профили для очень специфических данных.

EDIT

Используйте базу данных на основе документов (mongodb?) И забудьте о миграциях, фиксированных схемах, искусственных объединениях ... Вам нужно думать только о структурировании данных так, как вам действительно нужно, но преимущества стоит учитывать.

...