Django外键的使用之一对多

Django外键的使用之一对多

概要:

Django中如果要建立两张表之间的关系,通常要用到外键,而两个表之间的关系有一对一、一对多、多对多,今天就来谈谈一对多关系。

应用场景:

现在有两张表,一张是关于学生的表,一张是关于班级的表,这两张表之间存在这样的关系:学生中存在班级属性,即该学生位于哪一个班级,这时候班级就应该作为一个外键位于学生这张表中。

利用models.ForeignKey(Belong_To_Class, on_delete=models.DO_NOTHING)创建外键对应的外键,其中的第一个参数是关联的表名,on_delete表明了当学生这张表删除某些对象时对班级这张表会不会产生影响。

代码:

from django.db import models

# Create your models here.


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)

执行迁移并同步数据库过后会创建这两张表,当我们添加学生对象时就会有一个所属班级的属性。

这样外键就设置成功了。

但是一般还会有这样的需求:当我们知道一个班级对象时,想要知道其中包含的学生,这时就需要用到student_set来完成数据查询。可以先使用python manage.py shell来测试一下:

>>> from student.models import *
>>> Class = Belong_To_Class.objects.filter(pk=1)
>>> Class
>>> Class[0].student_set.all()
>>> Class[0].student_set.all()[0]
>>> Class[0].student_set.all()[0].name
'hwy'

django 默认每个主表的对象都有一个是外键的属性,可以通过它来查询到所有属于主表的子表的信息。 这个属性的名称默认是以子表的名称小写加上_set()来表示,默认返回的是一个querydict对象,你可以继续的根据情况来查询等操作。

这里需要说明的是:名称小写加上_set这个属性只是Django默认创建的,但是也支持用户自定义,需要用到related_name,现在我将外键这个属性的related_name自定义:

belong_to_class = models.ForeignKey(Belong_To_Class, on_delete=models.DO_NOTHING, related_name='hwy')

再使用shell来测试一下:

>>> from student.models import *
>>> Class = Belong_To_Class.objects.filter(pk=1)
>>> Class[0].hwy.all()
>>> Class[0].hwy.all()[1].name
'黄文杨'
>>>

可见自定义是成功的。

原文地址我的网站

编辑于 2018-08-17