您的位置:首页 > 编程语言 > Python开发

Python Django进阶教程(三)(模型的高级用法)

2017-05-11 12:03 731 查看
Django版本:1.11

操作系统:Windows

Python:3.5

欢迎加入学习交流QQ群:657341423

数据模型高级使用。这节主要讲模型的使用。回顾一下基础教程的模型设计





新建了三个表,分别Publisher,Author,Book。

其中Book有一个外键(publisher)和多对多值(authors)分别对Publisher和Author构成一个关联。

即Publisher<->Book<->Author

<->这个双向状态,可以通过Book分别与Publisher和Author的互通数据,但是Publisher不能跨越Book去查询Author。因为两者是没有直接关联的。

外键实例:

数据库数据:

Publisher:



Author:



Book:



polls_book_authors:(关联表,自动生成的)



我们在项目运行:python manage.py shell

Book->Publisher,从Book查询到Publisher

输入代码:



解释:

首先导入models里面的类,作为一个对象类型。

看图解释:



图中1、b = Book.objects.get(id=1)建立一个Book对象并查询id=1的数据。

图中2、b.publisher这个publisher是Book里面的字段publisher,这个属性是外键。所以返回结果是Publisher里面的数据。这里我设置是2,即是Publisher的id为2的数据。

图中3和4、因为 b.publisher没有指定返回Publisher那个值,所以默认返回
__str__
里面的返回值。

如果要返回其他值,如b.publisher.website即可。

Publisher->Book,从Publisher查询到Book

我们知道,外键在Book里面,而Publisher是没有外键的。所以这里Publisher->Book用法就和上面说的不一样了。

看图解释:



图中1、p = Publisher.objects.get(name=’luna’)建立一个Publisher对象并查询name=’luna’的数据。

图2和3、p.book_set.all(),属性名称book_set是由模型名称的小写(如book)加_set组成的。查询对应Book里面的数据。all()是默认返回
__str__
里面的返回值。

图4、返回结果。

注意,这里只能返回
__str__
里面的返回值。如果返回数据是多条,可以用filter进行筛选。



title__icontains:查询字段条件:字段__icontains

访问多对多值(Many-to-Many Values)

原理和外键的大同小异,直接看教程即可。



数据库字段增删

如果要对数据库的字段进行增删的话,要进行两个操作。

1、对models.py进行增删属性

2、对数据库字段进行增删。(可以sql语句或直接在可视化工具操作即可)

总的来说,就是保持models和数据库里面的字段一致就可以了。

注:models.py的字段删除了,数据库的可以不删除。但是反过来就不行了。

最后重启服务器就可以了。

其他删除





这里补充一下基础知识的:models的get和filter区别。

看图:







models里面是默认返回name字段的。基础教程是用p.all()是返回
__str__
默认返回值。但是实际中我们会需要其他字段。没理由将函数str每个值都写进去的。

我们可以用p.city实现查询其他字段。

这里get和filter,第一个返回一条数据,如果数据有2条就会报错,filter是符合条件就返回,是一个list。如果要查询city,应确定list位置再查询需要查询的字段。

增加额外的manager方法,修manager返回的初始QuerySet。

这个作用就是可以根据个人实际对models的数据进行筛选和操作等。

增加额外的manager方法







修改初始Manager QuerySets



模型方法:可以在models.py声明字段之外,还可以根据实际写方法。实际用法功能,与Manager 大同小异的。都属于自定义。





执行原始SQL查询



总结:

1、基本上模型的高级用法,就是用过外键,多对多这些数据库设计进行跨表访问数据。

2、数据库和模型的字段增加和删除,这个分别对这两项进行操作即可。

3、manager的额外增加和修改(重写)manager。即对objects的方法定义和重写。

4、models增加方法,这个和manager类似,只是manager在objects上,而这个直接对models的。

5、执行原始的Sql。

个人建议,如果要在models上添加方法,建议用第四点就好了,尽量不要用manager。

进阶教程代码:请点击
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  django python