人 - 技能多对多和技能水平

时间:2013-10-07 22:38:47

标签: django-models

我正在尝试将人员,他们的技能和技能水平联系起来。我的模型看起来像这样:

class Person(models.Model):
    first_name = models.CharField(max_length=200)
    middle_name = models.CharField(max_length=200, blank=True)
    last_name = models.CharField(max_length=200)
    skills = models.ManyToManyField(Skill)

class Skill(models.Model):
    name = models.CharField(max_length=200)
    description = models.CharField(max_length=1000, blank=True)
    active = models.BooleanField(default=True)

它确实有效(在管理员中),我可以创建一个人,添加几个技能等。但是,我还需要与每个人相关的每个技能的技能等级信息。像这样:

BASIC = 'BAS'
NOVICE = 'NOV'
INTERMEDIATE = 'INT'
ADVANCED = 'ADV'
EXPERT = 'EXP'

SKILL_LEVEL_CHOICES = (
    (BASIC, 'Basic knowledge'),
    (NOVICE, 'Novice (Limited experience)'),
    (INTERMEDIATE, 'Intermediate (Practical application)'),
    (ADVANCED, 'Advanced knowledge'),
    (EXPERT, 'Expert'),
)

我不确定应该向Person添加什么来获取每项技能及其级别的信息。

感谢。

1 个答案:

答案 0 :(得分:0)

在收集了一些关于Django的经验之后,我意识到它为我的问题提供了非常简单的解决方案:)

我需要两个课程,SkillLevel和SkillWithSkillLevel。

class SkillLevel(models.Model):
    name = models.CharField(max_length=20)
    description = models.CharField(max_length=100, blank=True)

class SkillWithSkillLevel(models.Model):
    skill = models.ForeignKey(Skill)
    level = models.ForeignKey(SkillLevel)
    person = models.ForeignKey(Person)

就是这样。

有一点自定义管理员是有帮助的:

class SkillWithSkillLevelInline(admin.TabularInline):
    model = SkillWithSkillLevel
    extra = 3

然后,当然,在PersonAdmin中注册SkillWithSkillLevelInline,inlines = [SkillWithSkillLevelInline]

人显然不需要skills = models.ManyToManyField(Skill)