2015-07-16 2 views
0

Хорошо - скажем, у меня есть настройка, где у меня есть набор людей и набор навыков и набор уровней.Структура модели базы данных django - через модели

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

E.g. Человек А может выполнять навыки каратэ и творческого письма. Он предлагает каратэ на уровне черного пояса за 40 фунтов стерлингов и красный уровень ремня за 30 фунтов стерлингов и творческое письмо на уровне начинающих за 25 фунтов стерлингов.

Вот как у меня есть настройка без уровня.

class Person(models.Model): 
    ... 
    skills = models.ManyToManyField(Skill, through='SkillOffered') 

class Skill(models.Model): 
    ... 

class SkillOffered(models.Model): 
    person = models.ForeignKey(Person) 
    skill = models.ForeignKey(Skill) 
    price = models.DemicalField(max_digits=6, decimal_places=2) 

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

ответ

0

вы должны создать класс уровня, связанный с классом Skill, соотношением m2m. И замените атрибут навыка в SkillOffered атрибутом skill_level.

class Person(models.Model): 
    ... 

class Skill(models.Model): 
    ... 
    levels = models.ManyToManyField(Levels, through='SkillLevels') 

class Level(models.Model): 
    ... 

class SkillLevels (models.Model): 
    skill = models.ForeignKey(Skill) 
    level = models.ForeignKey(Level) 

class SkillOffered(models.Model): 
    person = models.ForeignKey(Person) 
    skill_level = models.ForeignKey(SkillLevels) 
    price = models.DemicalField(max_digits=6, decimal_places=2) 
+0

Спасибо за ответ @jcs, что делает SkillLevels? ForeignKey to Skill и m2m to Level? – lac

+0

Да точно. Он присоединяется к вашему навыку «каратэ» с синим поясом уровней, «красным поясом» ... тогда предлагаемое умение представляет собой комбинацию из двух с определенной ценой. Поскольку цена специфична для комбинационного навыка/уровня не только умение – jcs

+0

Я просто редактировал классы Person и SkillLevels. Теперь человек связан с SkillOffered, SkillOpered связан с SkillLevels, который является комбинационной таблицей для навыка и уровня. – jcs

Смежные вопросы