在Django提供了三种models类型进行模型之间的关系链接,分别是:
一对一外键如:models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile');
一对多外键如:project = models.ForeignKey(WeldingProject, on_delete=models.CASCADE, verbose_name="焊接项目");
多对多外键如:wending_card = models.ManyToManyField(WeldingProcessCard, blank=True, null=True, verbose_name="使用了此焊材的焊接工艺卡")。
一对一外键
一对一外键提供了model的拓展性,能够在不改变原model的情况下扩展内容,示例如下:
class User(models.Model):
first_name = models.CharField(max_length=20, blank=True)
last_name = models.CharField(max_length=20, blank=True)
...
def __str__:
return xxx
class Profile(models.Model):
# 外键定义在拓展model中
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile') # 可通过related_name进行索引
phone = models.CharField(max_length=20, blank=True)
def __str__:
return phone
在任何时候(views、template),都可以通过related_name的值将拓展内容当作参数进行访问,在以上示例中可以这样调用:user.profile.phone 。
一对多外键
一对多外键的典型应用如下:
class Belong_To_Class(models.Model):
class_room = models.CharField(max_length=10)
class Student(models.Model):
name = models.CharField(max_length=10)
age = models.IntegerField()
belong_to_class = models.ForeignKey(Belong_To_Class, on_delete=models.DO_NOTHING)
在views中通过主题调用附属model时,可使用如下方式查询Class所有对应的Student:
Class = Belong_To_Class.objects.filter(pk=1)
Class[0].student_set.all()
在template中,可通过for循环遍历下属model,如:{% for student in class.student_set.all %}{% endfor %} 无需特意通过views的context传递值。
多对多外键
多对多外键不同意其它两种方式,一对一及一对多大多都是使用数据库的外键进行实现,多对多外键是创建第三个table用于储存对应的键值对。故多对多外键的定义不局限于其中某一个model,设置键值对的方式也有所不同,具体引用方式暂时未知,估计和一对多类似,暂时留坑,等后续用上了再看。