美文网首页
Django多表查询 1:N类型

Django多表查询 1:N类型

作者: 上帝大人 | 来源:发表于2019-04-18 22:36 被阅读0次

    添加外键及遇到的问题在上篇文章已结束

    多表查询(1.通过对象和2.通过模型类两种方法)

    第二种更好用感觉,第一种还要分两步,第二种一步搞定

    注意:

    多类一类就是一对多中的

    添加的多类模型类的外键的属性名为hbook,但是在数据库中,多类多了一列为hbook_id,在python代码中的叫属性,数据库中的是字段。

    • Person类是多类模型类,BookInfo是一类模型类
    • app_person是多类的,app_bookinfo是一类的

    一、 通过模型类的对象查询(这种要分为两步骤)

    一对多模型又分为一对多和多对一两种情况

    • 查询三国演义中多有的人物信息,三国演义已知,三国演义是一类,所以问题是一对多。

    已知三国演义,先查三国演义,然后得到的.小写多类模型类名_set.all()
    或者说一类模型类的对象名.小写多类模型类名set.all()

    from app.models import BookInfo
    def index(request):
        #查看三国演义中所有的人物信息
        book =BookInfo.objects.get(btitle='三国演义')
        text=''
        persons=book.person_set.all()
        for person in persons:
            text+=str(person.hbook_id)+person.pname
        return HttpResponse(text)
    

    这里遇到了点问题,一直查不出来,还报错UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in position 9737: illegal multibyte sequence,这是编码方式的问题,也就是乱码,你敲的三国演义不一定是你数据库中的三国演义,你可以改一下数据库或者pycharm的编码方式,或者,你把数据库中的三所演义复制到你所要查询的地方。

    • 查询孙悟空在那本书中,孙悟空是人物名,属于多类,所以问题是多对一。

    已知孙悟空,先查孙悟空,然后得到的.多类模型类外键对应的属性名或者说多类模型类的对象名.多类模型类中外键对应的属性名(这里的属性名就是你在models.py中设置的外键的属性的名字)

    from app.models import  Person
    def index(request):
        person =Person.objects.get(pname='孙悟空') #当然要导入Person这个models
        book = person.hbook
        text=book.btitle
        return HttpResponse(text)
    
    
    • 这两种情况中都要先查询已知的内容保存在一个变量中(这个变量的命名我们一般和他所在的表有关系,例如上面一对多的例子中,三国演义已知,他所在表为app_book,所以变量名我们叫做book),然后这个变量的.方法出现分歧
      为什么呢? 一对多:查找到的是多个值,所以.方法是多类模型类名_set.all()是all还是其他区别在于你是select *还是条件查询
      多对一:查询到的结果是一个值,所以不是,直接.外键属性名这里的外键属性名就是你创建模型类时,定义的外键的属性名。

    二、通过模型类来查询,更加简洁的方式(一步到位)

    也是一对多和多对一两种类型,但是本质相同的,简单记法。


    最好把外键属性定义的有另一个类的影子,就像person的外键属性我们定义为了hbook,这样我们就可以理所应当的假设book的外键属性为personinfo(小写的模型类名),只是为了简单记法。

    在后面我们会把这些封装在方法中,对外就提供增删改查的方法。

    相关文章

      网友评论

          本文标题:Django多表查询 1:N类型

          本文链接:https://www.haomeiwen.com/subject/pbatgqtx.html