0

次のモデルを構築する方法について、いくつかのガイダンスをいただければ幸いです。これを理想的な方法で行っていることを確認したいと思います。

職場の従業員に関する情報を追跡したいと考えています。基本的に過去の学歴と過去の職歴

だからここに私が考えることができる関係があります

  • 教育
    • 従業員は複数の学校に通うことができ、各学校には多くの生徒がいる可能性があります (m2m)
    • 学生は一定期間学校に通う
    • 学生は同じ学校から複数の学位を取得でき、その学校は複数の学位を提供しています (m2m)
  • 仕事(教育とほぼ同じ)
    • 従業員や企業とのm2m関係
    • 従業員は決められた時間に会社で働く
    • 従業員は 1 つの会社で複数の仕事を持つことができます (m2m)

基本的に上記の内容に従って、私が作成したコードは次のとおりです。

#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)
    ....

だから私の質問は次のとおりです。これは受け入れられる方法ですか?私は初心者で、人間関係を乱用しているだけなのかわかりません

また、開始日/終了日全体を行う簡単な方法があると確信しています...しかし、それを理解することはできませんでした

任意のポインタは大歓迎です、ありがとう!

4

1 に答える 1

1

多対多のフィールドでは、複数形を使用する必要があります。たとえば、それPersonはそうなるでしょう。educationsjobs

また、モデルフィールドではjob_description代わりに書くのが慣例です。jobDescription

Personフィールドschoolとは、それぞれ (現在) と(現在) をcompany介して情報にアクセスできるため、冗長です。educationseducationjobswork

companyの多対多フィールドは必要ないと思いますWork。シンプルForeignKeyで十分です。あなたは特定の期間、1 つの会社でしか特定の仕事をしていないと思います。複数の会社で同時に複数の仕事を持つことができますが、それでもすべての仕事は単一の雇用主にあります. それとも私が間違っていますか?

についても同様ですEducation。この教育の過程で複数の学校に通ったとしても、特定の科目の学位は 1 つの学校からしか取得できません。それとも、その状況を正確にモデル化したいですか?

すべての日付の命名は、実際にはすべて年であるため、少し誤解を招きます。NULLまた、年末に as'current'を使用してs を使用することもできますPositiveIntegerField

今、私はこのコードを持っています:

#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(...))

または、年フィールドのカスタム バリデータを作成することもできます。

于 2012-06-04T00:31:54.040 に答える