添加外键及遇到的问题在上篇文章已结束
多表查询(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(小写的模型类名),只是为了简单记法。
在后面我们会把这些封装在方法中,对外就提供增删改查的方法。
网友评论