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,'当前')。