Django 多种关系和中间模型(新手指导)

Django 多种关系和中间模型(新手指导),django,django-models,dry,Django,Django Models,Dry,对于如何构建以下模型,我非常感谢您的指导。我想确保我是以理想的方式做这件事的 我想记录一些关于我工作的员工的信息。基本上,过去的教育和工作经验 这就是我能想到的关系 教育 一名员工可以去几所学校,每所学校可以有许多学生(m2m) 学生在学校上学一段时间 一个学生可以从同一所学校获得多个学位,该学校提供多个学位(m2m) 工作(几乎与教育相同) m2m与员工和公司的关系 员工在公司工作到规定的时间 员工可以在一家公司从事多个工作(m2m) 基本上按照上面的内容,下面是我编写的代码: #

对于如何构建以下模型,我非常感谢您的指导。我想确保我是以理想的方式做这件事的

我想记录一些关于我工作的员工的信息。基本上,过去的教育和工作经验

这就是我能想到的关系

  • 教育
    • 一名员工可以去几所学校,每所学校可以有许多学生(m2m)
    • 学生在学校上学一段时间
    • 一个学生可以从同一所学校获得多个学位,该学校提供多个学位(m2m)
  • 工作(几乎与教育相同)
    • m2m与员工和公司的关系
    • 员工在公司工作到规定的时间
    • 员工可以在一家公司从事多个工作(m2m)
基本上按照上面的内容,下面是我编写的代码:

#在元组中列出数字
开始日期选项=范围(DATE.today().year-30,DATE.today().year+1)内x的dict((str(x),str(x))
结束日期选项=开始日期选项
开始日期选项=开始日期选项。项()
开始日期选项。排序()
开始日期选项。反向()
开始日期选项=元组(开始日期选项)
结束日期选项[“当前”]=“当前”
结束日期选项=结束日期选项。项()
结束日期选项。排序()
结束日期选项。反向()
结束日期选项=元组(结束日期选项)
#学校和公司
班级制度(models.Model):
name=models.CharField(最大长度=75)
班级教育(models.Model):
学位选择=(
('A.A.,'Associate'),
(‘小调’、‘小调’),
(“文学学士”,“文学学士”),
(“理学学士”,“理学学士”),
(‘大师’、‘大师’),
(“博士”,“哲学博士”),
)
school=models.ManyToManyField(机构,通过class='Dates')
degree=models.CharField(最大长度=5,选项=degree\u选项,null=True)
subject=models.CharField(最大长度=20,null=True)
课堂作业(models.Model):
company=models.ManyToManyField(机构,截止日期)
position=models.CharField(最大长度=50,null=True)
jobDescription=models.TextField(null=True)
上课日期(models.Model):
education=models.ForeignKey(education,null=True)
work=models.ForeignKey(work,null=True)
机构=模型。外键(机构)
开始=模型.CharField(最大长度=4,选项=开始日期选项)
end=models.CharField(最大长度=7,选项=end\u日期\u选项)
班级负责人(models.Model):
....
学校=模型.ManyToManyField(机构,空白=真)
教育=模型.ManyToManyField(教育,空白=真)
company=models.ManyToManyField(Institution,blank=True,related_name=“%(应用程序标签)s_%(类)s_related”)
工作=模型.ManyToManyField(工作,空白=真)
....
所以我的问题是:这是一种可以接受的方式吗?我是个新手,我不确定我是否只是在滥用人际关系

另外,我相信有一个更简单的方法来完成整个开始/结束日期的事情。。。但我没能弄明白


如果您有任何建议,我们将不胜感激,谢谢

对于多对多字段,应使用复数形式。对于
,这将是
教育
工作

此外,在模型字段中写入
job\u description
而不是
jobDescription
也是惯例

Person
中,字段
school
company
是多余的,因为这些信息分别可以通过
教育(当前
教育
)和
工作
)访问

我认为你不需要
工作
中的多对多领域
公司
。一个简单的
外键
就足够了。我认为在给定的时间内,你只在一家公司有一份特定的工作。你可以在多家公司同时拥有多份工作,但仍然每个工作都在一个雇主。还是我错了

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

所有日期的命名都有点误导,因为它们都是年份。您还可以在年底使用
NULL
作为
当前的
,并使用
PositiveIntegerField
s

现在我将有以下代码:

#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)
    ....
当然,如果你想在未来几年里有选择,你可以选择

YEAR_CHOICES = ((year, str(year)) for year in range(...))

或者,您也可以为您的年份字段进行搜索。

除非您真的要查询其中任何一个字段,否则您最好将其存储为
文本。
。是的,我希望人们能够搜索到优秀的字段,感谢您抽出时间回复。这很有帮助。对于您做出
YEAR\u选择的方式
,是否可以将
('current','current'),
附加到末尾?第一个值始终是实际的数据库值。这意味着它必须是一个数字。您可以附加(0,'当前')。