python - Django 模型、2 个外键、对象逻辑
问题描述
(大写过程中的对象)。
这是否合法,我的目标是拥有 3 个单独的对象(这背后的原因是允许我将特定的学校 + 专业分配给特定的教授)。当用户要选择一所学校时,我希望我的网站提取与该学校特别对应的专业,当他们选择专业时,我希望显示特定的教授。
以下对象之间的逻辑连接(业务规则)
SCHOOL 需要与 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)
另外,如果您对使这个逻辑更清晰有任何建议,我将不胜感激!
解决方案
尝试使用多对多字段来处理学校和专业之间的关系。我会将它添加到学校,因为我个人认为“学校有很多专业”比“很多学校都教授专业”更频繁,但两者都可以。
此外,将文本字段设置为类似于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)
教授将在没有多对多关系的情况下创建
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/
推荐阅读
- google-api - 使用 Google 的 API 将字符串拆分为单词?
- swift - MapKit 本地搜索结果填充表格
- node.js - 无法关闭 Nodemon SIGINT 事件处理程序内的猫鼬连接
- java - 在android中添加带有图标和名称的mikepenz materialdrawer布局
- java - 如何将消息拆分为更多消息
- javascript - 如何设置 heroku 环境变量出现在 NextJS 应用程序中?
- c# - C#最短的方法是什么
- node.js - 节点 JS 图像二进制字符串
- android - ios 和 Android 上 React Native 中的首字下沉
- maxscript - 在 Maxscript 中按下焦点按钮