Django学习06---Model模型(数据库)
2017-09-02 15:33
417 查看
一、model基本介绍
Django 模型是与数据库相关的, 与数据库相关的代码⼀般写在models.py 中, Django ⽀持 sqlite3, MySQL, PostgreSQL等数据库, 只需要在settings.py中配置即可, 不⽤更改models.py中的代码, 丰富的API极⼤的⽅便了使⽤。二、model具体使用
1、工程创建以及目录显示
创建工程:django-admin startproject douban
创建应用:
在douban工程项目目录下输入:
python manage.py startapp books(你想建立的app名称)
建立一个叫douban的app
这样,在你的工程项目douban目录下会出现一个叫books的目录
项目目录如下:
在douban目录settings.py中找到
INSTALLED_APPS
加入自己的app名称,比如’books’
2. 编写Model
在books目录下进入models.py输入类似下面的代码:
name、address等是模型的字段。每个字段都被指定成一个类属性,每个属性映射到一个数据库的列。 class Publisher(models.Model): name = models.CharField(max_length=30) address = models.CharField(max_length=50) city = models.CharField(max_length=60) state_province = models.CharField(max_length=30) country = models.CharField(max_length=50) website = models.URLField() def __unicode__(self): return self.name class Author(models.Model): name = models.CharField(max_length=30) age = models.IntegerField() email = models.EmailField() def __unicode__(self): return self.name class Book(models.Model): title = models.CharField(max_length=100) authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher) publication_date = models.DateField() def __unicode__(self): return self.title
上面的Publisher模型会在数据库中创建这样一张表:
CREATE TABLE books_publisher( "id" serial NOT NULL PRIMARY KEY, "name" varchar(30) NOT NULL, "address" varchar(30) NOT NULL, "city" varchar(30) NOT NULL, "state_province" varchar(30) NOT NULL, "country" varchar(30) NOT NULL, "website" varchar(30) NOT NULL, );
* 一些技术上的注意事项: *
这个表的名称books_publisher,是根据模型中的元数据自动生成的,也可以重写为别的名称。
id 字段是自动添加的,但这个行为可以被重写。详见自增主键字段。
这个例子中的CREATE TABLE SQL 语句使用PostgreSQL 语法格式,要注意的是Django 会根据设置文件 中指定的数据库类型来使用相应的SQL 语句
上面的每个class相当于一个新的table
django会自动给每个model配置一个名为id的primary key
3. 同步数据库(create table):
在shell中输入python manage.py makemigrations
此操作建立了模型到表的映射关系
python manage.py migrate
此操作生成表
之后你应该能看到诸如:
三. model具体操作
1、(插入一个新的对象) insert:
如果是在ubuntu中或者linux直接输入命令行,如果是在pycharm中直接Terminal中输入如下命令行则okfrom books.models import Author
方法1:
p1 = Author(name='zhangsan',age=30,email='zhangsan@126.com') p1.save()
方法2:
p1 = Author() p1. name='zhangsan' p1.age =30 p1.email='zhangsan@126.com' p1.save()
方法3:
Author.objects.create(name='zhangsan',age=30,email='zhangsan@126.com') 相当于 ---insert into books_author values('zhangsan', age=30,'zhangsan@126.com')
方法4:
Author.objects.get_or_create(name='zhangsan',age=30,email='zhangsan@126.com) 这种方法是防止重复很好的方法, 但是速度要相对慢些, 返回一个元组, 第一个为Author对象, 第二个为True或False, 新建时返回的是True, 已经存在时返回False.
2. 额外问题:为model加入字符串表现形式
在每个model里加入:def unicode(self):
return self.name
return 处写上你想要的字符串
3. (查询或选择对象)select:
3.1 获取一个记录对象:
Author.objects.get(name="zhangsan") --select * from books_author where name='zhangsan' 注意:get返回的对象具有唯一性质,如果符合条件的对象有多个,则get报错!
3.2 获取所有记录对象:
Author.objects.all() -- select * from books_author
3.3 获取满足某些条件的记录对象
名字完全等于zhangsan: Author.objects.filter(name='zhangsan') Author.objects.filter(name__exact='zhangsan') ——相当于 select from books_author where name = 'zhangsan' 名字对zhangsan大小写不敏感: Author.objects.filter(name__iexact='zhangsan') ——相当于 select from books_author where upper(name)='ZHANGSAN' 名字包含zhang: Author.objects.filter(name__contains="zhang") ——相当于 select from ... where name LIKE '%zhang%'; 查询条件使用正则: 区分大小写的正则: Author.objects.filter(name__regex='^zhang') 不区分大小写的正则: Author.objects.filter(name__iregex='^zhang') 以上方法,返回的都是一个list (其实是query set)
3.4 获取排除某些条件的记录对象
排除name等于zhangsan的记录: Author.objects.exclude(name ="zhangsan") 排除name中包含zhang的记录: Author.objects.exclude(name__contains="zhang") 以上filter和exclude也可以组合使用: 获取姓zhang但是不叫zhangsan的: Author.objects.filter(name__iregex='^zhang').exclude(name__contains='san')
3.5. (对结果排序) order:
Author.objects.order_by("name") ——相当于 select from ... ORDER BY name; 多项排序: Author.objects.order_by("age", "name") 逆向排序: Author.objects.order_by("-name") 连锁查询: Author.objects.filter(age=30).order_by("-name")
4. (更新对象)update:
1)使用save()方法:
p = Author.objects.get(name='Zhangsan') p.name = 'zhangsan' p.save() ——相当于 UPDATE books_Author SET name = 'zhangsan', age = 30, email = 'zhangsan@126.com' WHERE name='Zhangsan'; 所有的列都被更新了!效率低!
2)用update() 方法才比较好:
Author.objects.filter(name='Zhangsan').update(name='zhangsan') ——相当于 UPDATE books_Author SET name = 'zhangsan' WHERE name='Zhangsan'; 可以对多行同时进行更新: Author.objects.all().update(country='USA') update()方法会返回一个整型数值,表示受影响的记录条数
5. (删除对象)delete:
调用该对象的delete()方法即可: p = Author.objects.get(name="O'Reilly") p.delete() 一旦使用all()方法,所有数据将会被删除: Author.objects.all().delete()
相关文章推荐
- django学习——model.py中重写user模型
- pythonWeb -- Django开发- 模型Model 和 数据库的操作
- PythonWeb开发Django框架学习(八)Model与数据库初步
- Django--model模型绑定_数据库操作
- django学习入门二:链接数据库、创建数据库model、学习django的admin模块
- django学习——Model模型中多对多外键如何查询
- django 模型model与数据库2——函数
- QT学习——数据库SQL模型类(QSqlTableModel模型)
- django 模型model与数据库3——高级操作(外联,多对多,修改字段)
- PythonWeb开发Django框架学习(九)使用Model类操作数据库数据
- python学习之--Django--连接数据库mysql创建model
- The Definitive Guide To Django 2 学习笔记(九) 第五章 模型 (一)数据库访问
- Django学习(八)(模型数据库)
- django 学习-6 定义模型--数据库的使用
- python例子-Django之模型(Model_数据库)
- django学习之三:model模型创建
- Django06模型(Model)
- django Model模型二及Model模型对数据库的操作
- Python django学习之:model (与数据库操作)
- Django学习07---model模型以及关系模型