首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ManyToMany关系和中间模型(新手指南)

ManyToMany关系和中间模型(新手指南)
EN

Stack Overflow用户
提问于 2012-06-03 22:05:00
回答 1查看 156关注 0票数 0

我很想知道如何构造下面的模型。我想确定我是以理想的方式做这件事的。

我想了解一下我工作中员工的一些情况。基本上,过去的教育和过去的工作经验

这就是我能想到的关系

  • 教育
    • 一名雇员可能去过几所学校,每所学校都有许多学生(m2m)
    • 学生在学校上学一段时间
    • 一个学生可以在同一所学校获得多个学位,而该学校提供多个学位(m2m)

  • 工作(几乎与教育相同)
    • m2m与员工和公司的关系
    • 雇员在公司工作到一定的时间
    • 雇主可以在一家公司有几个工作(m2m)

下面基本上是上面的内容,下面是我编写的代码:

代码语言:javascript
复制
#make a list of numbers in a tuple
START_DATE_CHOICES = dict((str(x),str(x)) for x in range(date.today().year-30,date.today().year+1))
END_DATE_CHOICES = START_DATE_CHOICES
START_DATE_CHOICES = START_DATE_CHOICES.items()
START_DATE_CHOICES.sort()
START_DATE_CHOICES.reverse()
START_DATE_CHOICES = tuple(START_DATE_CHOICES)

END_DATE_CHOICES['current'] = 'current'
END_DATE_CHOICES = END_DATE_CHOICES.items()
END_DATE_CHOICES.sort()
END_DATE_CHOICES.reverse()
END_DATE_CHOICES = tuple(END_DATE_CHOICES)

#both schools and companies
class Institution(models.Model):
    name = models.CharField(max_length = 75)

class Education(models.Model):
    DEGREE_CHOICES = (
                      ('A.A.', 'Associate'),
                      ('Minor', 'Minor'),
                      ('B.A.', 'Bachelor of Arts'),
                      ('B.S.', 'Bachelor of Science'),
                      ('Masters', 'Masters'),
                      ('Ph. D.', 'Doctor of Philosophy'),
                      )
    school = models.ManyToManyField(Institution, through='Dates')
    degree = models.CharField(max_length = 5, choices = DEGREE_CHOICES, null = True)
    subject = models.CharField(max_length = 20, null = True)

class Work(models.Model):
    company = models.ManyToManyField(Institution, through='Dates')
    position = models.CharField(max_length = 50, null = True)
    jobDescription = models.TextField(null = True)

class Dates(models.Model):
    education = models.ForeignKey(Education, null = True)
    work = models.ForeignKey(Work, null = True)
    institution = models.ForeignKey(Institution)

    start = models.CharField(max_length = 4, choices = START_DATE_CHOICES)
    end = models.CharField(max_length = 7, choices = END_DATE_CHOICES)


class Person(models.Model):
    ....
    school = models.ManyToManyField(Institution, blank=True)
    education = models.ManyToManyField(Education, blank = True)
    company = models.ManyToManyField(Institution, blank = True, related_name="%(app_label)s_%(class)s_related")
    work = models.ManyToManyField(Work, blank=True)
    ....

,所以我的问题是:这是一种可以接受的方法吗?我是个新手,我不知道我是不是在滥用感情

另外,我相信还有更简单的方法来完成整个开始/结束日期的事情.但没能弄清楚

任何指点都将不胜感激,谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-04 00:31:54

对于许多到许多字段,您应该使用复数形式。例如,对于Person,这将是educationsjobs

此外,在模型字段中编写job_description而不是jobDescription也是惯例。

Person中,schoolcompany字段是冗余的,因为这些信息可以分别通过educations (当前的education)和jobs (当前的work)访问。

我认为您不需要Work中的多到多字段Work。一个简单的ForeignKey就足够了。我想你在某一家公司只有一份特定的工作。你可以在多家公司同时拥有多份工作,但每一份工作都是在一个雇主那里。还是我错了?

Education也是如此。你只有一所学校的特定学科的学位,即使你在这个教育过程中上过几所学校。还是你想要这样准确地模拟这种情况?

所有日期的命名有点误导,因为它们都是漫不经心的年份。您还可以在年底使用NULL作为'current',并使用PositiveIntegerField的。

现在我会有这样的代码:

代码语言:javascript
复制
#both schools and companies
class Institution(models.Model):
    name = models.CharField(max_length = 75)

class Education(models.Model):
    DEGREE_CHOICES = (
                      ('A.A.', 'Associate'),
                      ('Minor', 'Minor'),
                      ('B.A.', 'Bachelor of Arts'),
                      ('B.S.', 'Bachelor of Science'),
                      ('Masters', 'Masters'),
                      ('Ph. D.', 'Doctor of Philosophy'),
                      )
    school = models.ForeignKey(Institution)
    degree = models.CharField(max_length = 5, choices = DEGREE_CHOICES, null = True)
    subject = models.CharField(max_length = 20, null = True)
    start_year = models.PositiveIntegerField()
    end_year = models.PositiveIntegerField(null=True)

class Job(models.Model):
    company = models.ForeignKey(Institution)
    position = models.CharField(max_length = 50, null = True)
    job_description = models.TextField(null = True)
    start_year = models.PositiveIntegerField()
    end_year = models.PositiveIntegerField(null=True)


class Person(models.Model):
    ....
    educations = models.ManyToManyField(Education, blank = True)
    jobs = models.ManyToManyField(Work, blank=True)
    ....

当然,如果你想在这些年里有选择的话,你可以拥有它们。

代码语言:javascript
复制
YEAR_CHOICES = ((year, str(year)) for year in range(...))

或者,您也可以为您的年度字段提供编写自定义验证器

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10874294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档