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

时间:2019-01-28 17:51:12

标签: python django django-models python-3.7

(在过程中将对象大写)。

  

这是否合法,我的目标是拥有3个单独的对象(   这是为了让我分配一所特定的学校+   专门教授)。当用户要选择学校时,我   希望我的网站提取专门对应的   那个学校,当他们选择一个专业时,我想要   要显示的教授。

下面的对象之间的逻辑连接(业务规则)

  

学校必须与MAJOR建立多对多的关系:

     
      
  • 一个学校可以有很多专业
  •   
  • 一个专业可以有很多学校
  •   
     

教授

     
      
  • 教授可以在一个学校工作,并且可以教一个专业
  •   
  • 很多教授可以在很多学校教专业。
  •   

因此,我的难点是写出模型的逻辑以确保满足所有条件,在规则之前设置的信息是我希望用户拥有的从数据库到网站的信息获取的经验,并且下面的逻辑。

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)

此外,如果您有关于使此逻辑更清晰的建议,我将不胜感激!

1 个答案:

答案 0 :(得分:1)

尝试将多对多字段用于学校和专业之间的关系。我将其添加到学校中,是因为我个人认为“学校有很多专业”比“很多学校都提供专业”要好得多,但都可以。

还要将文本字段设置为name之类的,因为这就是文本字段所代表的含义:不是学校/专业,而是学校/专业的名称。除此之外,您的逻辑看起来还不错

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)

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

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/