Django外键(ForeignKey)操作以及related_name的作用

  之前已经写过一篇关于Django外键的文章,但是当时并没有介绍如何根据外键对数据的操作,也就是如何通过主表查询子表或者通过子表查询主表的信息

   首先我定义了两个模型,一个是老师模型,一个是学生模型,一个老师对应多个学生,这个算是一个一对多的类型(如下图所示)

     

      那么如果我们要想查询一个老师对应的学生有哪些,该如何操作呢?

     首先我们先查询到老师的信息,在这里我们使用python shell 进行演示  ,输入命令python manage.py shell 进入python shell操作界面:

     第一步需要做的自然还是需要将我们的模型导入进来,并获取老师的相关信息

    

       返回一个teacher对象,接下来就是查询teacher相关联的学生对象,在这里有一个需要注意的点,django默认情况下每一个主表的对象都有一个是外键的属性,可以通过它查询到所有关于子表的信息,这个属性的名字就是子表的名称小写加上_set,具体到这个就是student_set,默认返回的是QuerySet,操作如下:

     

      在这里也会牵涉到另外一个知识点related_name的使用,在models.py使用Foreign定义外键的时候也可以传入一个参数related_name,操作如下:

 执行python manage.py makemigrations 和  python manage.py migrate 

   

     从上图可以看到和之前的_set操作的效果是一样的,这两个方法是相同的,所以如果觉得比较麻烦的话,可以在定义主表的外键的时候,直接就给外键定义好名称使用related_name

    上面的查询主要是通过主表查询子表的信息

    下面说一下如何通过子表查询主表的相关信息,也就是查询一个学生所对应的老师的信息

     首先需要先获取一个子表的对象,那么就可以通过定义外键时候的那个外键的字段名获取关于主表的信息了

     比如我得到了一个student对象,然后我想要得到这个student对象对应的主表teache中的信息的话,就使用  student.teacher 获取,其中这个teacher就是在子表中定义的外键字段,如下:

   

foreign key的related_name是Django框架中常用的一个属性,用于指定关联模型的反向关系中的名称。它可以帮助我们更方便地在关联模型中访问相关的对象集合。 当我们在一个模型中定义了一个foreign key字段时,Django会自动为该字段添加一个related_name属性,默认值为关联模型的小写名称加上"_set"。这意味着我们可以通过关联模型对象的名称加上"_set"来访问该关联模型对象的集合。 然而,有时候我们可能希望使用更具有意义的名称来引用这些相关对象,而不是使用自动生成的默认名称。这就需要使用related_name属性了。 我们可以在定义foreign key字段时通过related_name属性来指定我们想要的反向关系的名称。例如,如果一个博客模型有一个外键指向用户模型,并且我们想要在用户模型中使用 "blogs" 来访问该用户发表过的博客列表,我们可以这样定义: class Blog(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blogs') 这样一来,我们就可以通过 "user.blogs" 来访问该用户发表过的所有博客。 需要注意的是,related_name属性在一对一关系和多对多关系上也可以使用,用法与上面类似。不过在多对多关系中,如果我们指定了一个表名作为related_name,Django会使用这个表名的复数形式来作为反向关系的名称。 总之,foreign key的related_name属性非常有用,可以帮助我们更灵活地访问关联模型的对象集合。通过合理使用related_name属性,我们可以方便地在代码中获取到我们想要的相关对象。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值