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


Django版本:1.11
操作系统:Windows
Python:3.5
欢迎加入学习交流QQ群:657341423


数据模型高级使用。这节主要讲模型的使用。回顾一下基础教程的模型设计
Python Django进阶教程(三)(模型的高级用法)
Python Django进阶教程(三)(模型的高级用法)
新建了三个表,分别Publisher,Author,Book。
其中Book有一个外键(publisher)和多对多值(authors)分别对Publisher和Author构成一个关联。
即Publisher<->Book<->Author
<->这个双向状态,可以通过Book分别与Publisher和Author的互通数据,但是Publisher不能跨越Book去查询Author。因为两者是没有直接关联的。


外键实例:
数据库数据:
Publisher:
Python Django进阶教程(三)(模型的高级用法)

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

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

polls_book_authors:(关联表,自动生成的)
Python Django进阶教程(三)(模型的高级用法)

我们在项目运行:python manage.py shell
Book->Publisher,从Book查询到Publisher
输入代码:
Python Django进阶教程(三)(模型的高级用法)
解释:
首先导入models里面的类,作为一个对象类型。
看图解释:
Python Django进阶教程(三)(模型的高级用法)
图中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用法就和上面说的不一样了。
看图解释:
Python Django进阶教程(三)(模型的高级用法)
图中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进行筛选。
Python Django进阶教程(三)(模型的高级用法)
title__icontains:查询字段条件:字段__icontains


访问多对多值(Many-to-Many Values)
原理和外键的大同小异,直接看教程即可。
Python Django进阶教程(三)(模型的高级用法)


数据库字段增删
如果要对数据库的字段进行增删的话,要进行两个操作。
1、对models.py进行增删属性
2、对数据库字段进行增删。(可以sql语句或直接在可视化工具操作即可)
总的来说,就是保持models和数据库里面的字段一致就可以了。
注:models.py的字段删除了,数据库的可以不删除。但是反过来就不行了。
最后重启服务器就可以了。

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

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


这里补充一下基础知识的:models的get和filter区别。
看图:
Python Django进阶教程(三)(模型的高级用法)
Python Django进阶教程(三)(模型的高级用法)
Python Django进阶教程(三)(模型的高级用法)
models里面是默认返回name字段的。基础教程是用p.all()是返回__str__ 默认返回值。但是实际中我们会需要其他字段。没理由将函数str每个值都写进去的。
我们可以用p.city实现查询其他字段。
这里get和filter,第一个返回一条数据,如果数据有2条就会报错,filter是符合条件就返回,是一个list。如果要查询city,应确定list位置再查询需要查询的字段。


增加额外的manager方法,修manager返回的初始QuerySet。
这个作用就是可以根据个人实际对models的数据进行筛选和操作等。
增加额外的manager方法
Python Django进阶教程(三)(模型的高级用法)
Python Django进阶教程(三)(模型的高级用法)
Python Django进阶教程(三)(模型的高级用法)

修改初始Manager QuerySets
Python Django进阶教程(三)(模型的高级用法)


模型方法:可以在models.py声明字段之外,还可以根据实际写方法。实际用法功能,与Manager 大同小异的。都属于自定义。
Python Django进阶教程(三)(模型的高级用法)
Python Django进阶教程(三)(模型的高级用法)


执行原始SQL查询
Python Django进阶教程(三)(模型的高级用法)


总结:
1、基本上模型的高级用法,就是用过外键,多对多这些数据库设计进行跨表访问数据。
2、数据库和模型的字段增加和删除,这个分别对这两项进行操作即可。
3、manager的额外增加和修改(重写)manager。即对objects的方法定义和重写。
4、models增加方法,这个和manager类似,只是manager在objects上,而这个直接对models的。
5、执行原始的Sql。

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


进阶教程代码:请点击