Хитрое образцовое наследование - Django

Я думаю, что это немного хитро, по крайней мере, для меня.:)

Таким образом, у меня есть 4 модели Person, Зингер, Басист и Ниндзя.

Зингер, Басист и Ниндзя наследовался от Человека.


Проблема состоит в том, что каждый Человек может быть любым из ее подклассов.

например, человеком может быть Зингер и Ниндзя. Другой Человек может быть Басистом и Ниндзя. Другой может быть всеми тремя.

Как я должен организовать свои модели?


Справка очень ценилась бы!

14
задан RadiantHex 22 March 2010 в 02:01
поделиться

3 ответа

Я согласен с решением по ролям, представленным Алексом. У вас нет разных подклассов людей. У вас могут быть разные роли.

Но я слышал, вы говорите: «эй, у ниндзя может быть свойство« numberOfStars », а у певца может быть свойство« highNote ». То же, что и для интерфейса: у ниндзя может быть метод throwStar () и он исчезнет. (), в то время как певец может использовать sing () и getWasted (), а басист - goFunky () и slapPop ()

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

То, в чем вы рискуете, - это мир онтологий, а не схем. У вас есть ресурс, который является «чем-то», и это что-то может быть определенного типа, иметь некоторые свойства и т. Д. Наличие некоторых свойств может указывать на тип, а наличие какого-либо типа может указывать на другие типы. Вы не можете легко описать эту информацию с помощью простой модели данных django. Вам понадобится контекстно-зависимое хранилище графиков с логическими выводами, такое как AllegroGraph, или реализовать взломанное решение с помощью rdflib.

2
ответ дан 1 December 2019 в 12:51
поделиться

Множественное наследование не очень хорошо работает с базами данных (а ваши модели Django в конечном итоге должны быть привязаны к базе данных), и наследование часто является плохим способом моделирования "ролей" (потому что роли людей меняются). Я бы взял Singer, Bassist и Ninja как "роли", не как подклассы Person, и связал их через внешние ключи:

class Singer(models.Model):
    person = models.ForeignKey('Person')
    # ...

class Person(models.Model):
    # ...
15
ответ дан 1 December 2019 в 12:51
поделиться

В принципе, вы можете сделать что-то вроде следующего:

class Role(models.Model):       
     ......

class Ninja(Role):
     .......

class Person(models.Model):
      roles = models.ManyToManyField(Role)

Но затем вы столкнетесь с проблемой, что Person.roles.objects.all() может дать вам только экземпляры Role. Поэтому вам нужен метод, приводящий каждый экземпляр Role к подходящему подклассу, например Ninja или Pirate. Вот ссылка на тему, в которой обсуждается эта проблема.

http://groups.google.com/group/django-users/browse_thread/thread/f4241bc16455f92d/7268c3f7bca6b046

Короче говоря, Алекс и Стефано дали больше полезных ответов, чем я.

3
ответ дан 1 December 2019 в 12:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: