听完还是不太懂

听完还是不太懂

老师您好,能麻烦再讲一下为什么一定需要使用外链以及related_name到底有什么用处么?

听完头更晕了(捂脸)

http://img1.sycdn.imooc.com//climg/5f0c69d8097b17cb07440197.jpg

这两种方法都能得到每位学生的总分,但第一种明显更方便也更容易理解呀,为什么还需要采用第二种方法呢

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
阿邸 2020-09-06 18:00:45

个人觉得最大的区别是:第一种方法适用单表查询,第二种方法适用多表查询,即有外键关联的查询


这样子理解不知道对不对:

related_name:添加于创建外键关联的字段

被关联表可以通过related_name关键字调用关联表下的字段

class Student(models.Model):
    '''学生表'''
    name = models.CharField("学生姓名", max_length=24)

    class Meta:
        db_table = "student"


class Scour(models.Model):
    stu_name = models.ForeignKey(Student, on_delete=models.CASCADE, related_name="stu_name")
    scour = models.FloatField("分数")

    class Meta:
        db_table = "stu_scour"
        
def sum(request):
    """查询每个学生的成绩总和"""
    eve_total = student.objects.all().annotate(Sum(stu_name__scour))
    for item in eve_total:
        print(item.name, item.stu_name__scour__sum)
    return HttpResponse("ok")

有个问题不明白:related_name是只适用于聚合函数查询吗?

好帮手慕元宝 2020-07-14 11:36:50

同学你好:

1、related_name:Django中默认每个主表的对象都有一个是外键的属性,可以通过它来查询到所有属于主表的子表的信息。这个属性的名称默认是以子表的名称小写加上_set()来表示(例:表名为student,则此时为student_set),若设置了related_name,则可以使用related_name的值来代替表名

例:

class Person(models.Model):
    name = models.CharField(verbose_name='作者姓名', unique=True, max_length=10)
    age = models.IntegerField(verbose_name='作者年龄')
 
class Book(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    title = models.CharField(verbose_name='书籍名称', max_length=10)
    pubtime = models.DateField(verbose_name='出版时间')

查询person关联的所有书籍对象:book = person.book_set.all()

若定义了related_name为person_books,则可以使用person.person_books.all()

2、如果只针对实现这个效果两种方式都可以,具体需要根据实际场景选择更适合的方式。这里老师只是为了给同学演示一下两种方法的效果

如果我的回答解决了同学的疑惑,欢迎采纳!祝同学学习愉快

  • 老师,book = person.book_set.all()这句代码中,第一个person是指主表名字,第二个book是指子表名字么,然后子表名字book可以替换为related_name
    2020-07-14 15:00:11
  • 同学你好:同学理解是正确的,book_set可以替换related_name的名称
    2020-07-14 17:45:06
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
3.从网页搭建入门Python Web
  • 参与学习           人
  • 提交作业       218    份
  • 解答问题       3562    个

本阶段带你用Python开发一个网站,学习主流框架Django+Flask是Python Web开发的第一步,在基础知识上实现积分商城的项目开发,体验真实的项目开发流程,提高解决编程问题和效率的能力。

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师