Django多表查询 1:N类型

2019-04-18  本文已影响0人  上帝大人

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

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

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

注意:

多类一类就是一对多中的

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

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

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

已知三国演义,先查三国演义,然后得到的.小写多类模型类名_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(小写的模型类名),只是为了简单记法。

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

上一篇 下一篇

猜你喜欢

热点阅读