Django 模型、2 个外键、对象逻辑

Django models, 2 foreign keys, object logic

(进程内对象大写)

Is this considered legal, my goal is to have 3 individual objects (the reasoning behind this is to allow me to assign a specific school + major to specific professors). When a user is to select a SCHOOL, I want my website to pull the MAJORS that specifically correspond to that SCHOOL, and when they select a MAJOR, I want the specific PROFESSORS to display.

以下对象之间的逻辑联系(业务规则)

The SCHOOL needs to be a many-to-many relationship with MAJOR:

  • One SCHOOLS can have MANY Majors
  • One Major can have MANY SCHOOLS

The PROFESSOR

  • a PROFESSOR can work at ONE SCHOOL, and teach ONE MAJOR
  • a Major can be taught by MANY PROFESSORS, at MANY SCHOOLS

所以我的困难是写出模型的逻辑以确保满足所有条件,规则之前设置的信息是我希望我的用户在从数据库中提取信息到网站时拥有的体验,以及它下面的逻辑。

from django.db import models

    class Professor(models.Model):
        School = models.ForeignKey(School , on_delete=models.CASCADE)
        Major = models.ForeignKey(Major , on_delete=models.CASCADE)

    class Major(models.Model):
        Major = models.CharField(max_length=30)
        School = models.ForeignKey(School , on_delete=models.CASCADE)

    class School(models.Model):
        School = models.Charfield(max_length=50)

此外,如果您有任何建议可以使此逻辑更清晰,我将不胜感激!

尝试使用多对多字段来表示学校和专业之间的关系。我会把它添加到学校,因为我个人认为它 "Schools have many majors" 比 "Majors are taught at many schools" 更频繁,但两者都可以。

此外,将文本字段设置为类似 name 的内容,因为这就是文本字段所代表的内容:不是 school/major,而是 school/major 的名称。除此之外,你的逻辑看起来不错

from django.db import models

class Major(models.Model):
    name = models.CharField(max_length=30, db_index=True)

class School(models.Model):
    name = models.Charfield(max_length=50, db_index=True)
    majors = models.ManyToManyField(Major)

class Professor(models.Model):
    school = models.ForeignKey(School , on_delete=models.CASCADE)
    major = models.ForeignKey(Major , on_delete=models.CASCADE)

一旦你有了这个,你就可以抓取主要对象并将它们添加到学校

major = Major.objects.get(name='Physics')
school = School.objects.get(name='Harvard')
school.majors.add(major)  

...或通过反向查找(“_set”属性)获取学校并将其添加到专业:

school = School.objects.get(name='Harvard')
major = Major.objects.get(name='Physics')
major.school_set.add(school)

教授将在没有多对多关系的情况下创建

school = School.objects.get(name='Harvard')
major = Major.objects.get(name='Physics')
Professor.objects.create(school=school, major=major)

关于 ManyToManyField 的文档参考:https://docs.djangoproject.com/en/2.1/topics/db/examples/many_to_many/