ORM的模型类字段类型
- BooleanField()
数据库类型为tinyint(1)
在编程语言中使用True和False来表示值
在数据库中用0和1来表示值
2.CharField()
数据库类型为varchar
参数:max_length:字符的最大位数
注:该参数是必须值
3.DateField()
数据库类型为date
用来表示时间
参数:auto_now:设置为True时,在每次保存时都会将变量的值设置为当前的时间
auto_now_add:设置为True时,只在第一次创建的时候设置当前时间,后序的添加和删除都不会更新时间
default:设置时间,为固定的一个字符串,为default设置的值例如('2021/9/18')则这个变量的值始终为这个固定的时间注:以上的三个参数只能存在一个
4.DateTimeField()
类型为datetime(6)
表示时间,参数和DateFileld()一致
5.FloatField()
类型为double型
6.DecimalField()
数据库类型为decimal(x,y)
在编程中用小数来表示该值
数据库中也是小数
参数:max_digits:总位数,包括小数点后面的位数
decimal_places:小数位数注:这两个参数也是必须的
7.EmailField()
数据库类型为varchar
在djago中存储到数据库时,会进行正则的判断,如果不是Email类型的就不会存储到数据库中
8.IntergerField()
数据库类型为int型
9.ImageField()
数据库类型为varchar(100)
作用是存储图片的路径
django用字符串来表示该值
10.TextField()
数据库类型为longtext
用于存储不定长字符串
官方文档中还有很多类型,上述的是常用的一些类型
https://docs.djangoproject.com/en/2.2/ref/models/fields/#field-types
例:
创建一个Author新表
属性中含有:
姓名 :varchar型,最大长度为20
年龄:int型
邮箱:varchar型
在bookstore这个应用中的models文件中,新创建一个类,叫做Author
class Author(models.Model):
name = models.CharField('姓名',max_length=20,default='')
age = models.IntegerField('年龄',default='')
email = models.EmailField('邮箱',default='')
models文件中创建一个表,要包括
导入库 from django.db import models
一个类要继承models.Model
class 类名(models.Model):
变量名 = models.字段名(字段选项)
其中的字段选项指的是指定创建类的额外信息
允许出现多个字段选项,中间要使用,隔开
字段选项参数
primary:如果设置为True,则表示该列为主键,如果所有的列中都不含有这个参数,django会创建一个新的id列为主键,默认为False
blank:设置为True,表示字段可以为空,为False表示非空,默认为False
null:设置为True,表示该列值允许为空,默认为False,如果此选项为False,建议加上default来填充默认参数值
default:设置列的默认值
db_index:设置为True,则表示改列增加索引
unique:设置为True,表示唯一键即不允许有重名的值出现
db_column:指定列的名称,如果不指定则使用属性名称为列名称
verbose_name:设置该字段在admin界面上显示名称
例:
创建一个属性,用户名称,最大长度为30,唯一键,添加索引,不允许为空,默认值设置为N/A
name = models.CharField(max_length=30,db_index=True,unique=True,null=False,default='')
Meta类的定义
使用内部类Meta来给模型赋予属性,Mete类下有很多内建的类属性,可以对模型类做一些控制
实例:
class Book(models.Model):
title = models.CharField('书名', max_length=50, default='') # 创建书名属性,最大长度为50,类型为char型
price = models.DecimalField('价格', max_digits=7, decimal_places=2, default='') # 创建价格属性,精度为7位,小数两位,类型为价格类型
info = models.CharField('描述', max_length=100, default='')
class Meta:
db_table = 'book'# 修改模型的名称,原来的名称为app名称+类名称,设置该变量名称后,模型名称就为book,但是仍要进行makemigrating migrate
实现
from django.db import models
# Create your models here.
class Book(models.Model):
title = models.CharField('书名', max_length=50,default='',unique=True) # 创建书名属性,最大长度为50,类型为varchar型,唯一性
pub = models.CharField('出版社',max_length=100,default='',null=Fasle) # 创建出版社属性,最大长度为100,类型为varchar,非空
price = models.DecimalField('价格', max_digits=7, decimal_places=2,default=0.0) # 创建价格属性,精度为7位,小数两位,类型为浮点类型
mark_price = models.DecimalField('零售价',max_digits=7,decimal_places=2,default=0.0) # 创建零售价属性,精度为7,小数位数为2,类型为浮点型
class Meta:
db_table = 'book' # 将表名设置为book
class Author(models.Model):
name = models.CharField('姓名', max_length=11,null=False,default='') # 创建姓名属性,长度为11,非空
age = models.IntegerField('年龄', default=1) # 创建年龄属性,默认值为1
email = models.EmailField('邮箱', null=True) # 创建邮箱属性,可以为空
class Meta:
db_table = 'author'
ORM操作
包括增删改查操作,即(CRUD操作)
核心是->模型类.管理器对象
管理器对象
每一个继承models.Model的类对象,都有一盒object对象同样被继承下来,他就是管理器对象
数据库的增删改查可以通过模型的管理器实现
创建数据
创建数据中每一条记录就是创建一个数据对象
方案一:
MyModel.object.create(属性1=值1,属性2=值2,属性3=值3…)
成功:返回创建好的对象
失败:抛出异常
方案二:
obj = MyModel(属性1=值1,属性2=值2) # 实例化一个对象
obj.属性3 = 值3
obj.save() # 只有调用.save()时才将数据传入到数据库
Django shell
Django提供的一个交互式的操作项目叫做Django Shell,他能够在交互模式用项目工程代码执行响应的操作 利用Djangoshell 可以代替编写view代码来进行直接的操作
注意项目代码发生变化的时候,要重新进入Django Shell
命令:python manage.py shell
方法一
In [1]: from bookstore.models import Book
In [2]: b1 = Book.objects.create(title='Python',pub='清华大学出版社',price=20,mark_price=25)
In [7]: obj = Book(title='Java',pub='电子科技大学出版社',price=25)
In [8]: obj.mark_price = 30
In [9]: obj.save()
查询数据
数据库的查询需要使用管理器对象进行
通过MyModel.object管理器对象调用查询方法进行
方法:
all():
用法:MyModel.objects.all()
等同于在数据库命令栏中的SELECT * from table
查询全部对象,返回QuerySet对象里面放的是类对象
In [22]: book = Book.objects.all()
In [23]: books = Book.objects.all()
In [24]: for book in books:
...: print("书名为:",book.title,"出版社为:",book.pub)
...:
书名为: Python 出版社为: 清华大学出版社
书名为: Java 出版社为: 电子科技大学出版社
书名为: Django 出版社为: 清华大学出版社
书名为: JQure 出版社为: 机械工业出版社
书名为: Linux 出版社为: 机械工业出版社
书名为: HTML5 出版社为: 清华大学出版社
In [25]: books
Out[25]: <QuerySet [<Book: Book object (1)>, <Book: Book object (2)>, <Book: Book object (3)>, <Book: Book object (4)>, <Book: Book object (5)>, <Book: Book object (6)>]>
vlues(‘列1’,‘列2’…):
用法:MyModels.objects.values(…)
作用:查询部分列并返回字典数据对象
返回值:QuerySet内容为字典类型
In [26]: b2 = Book.objects.values('title','pub')
In [27]: b2
Out[27]: <QuerySet [{'title': 'Python', 'pub': '清华大学出版社'}, {'title': 'Java', 'pub': '电子科技大学出版社'}, {'title': 'Django', 'pub': '清华大学出版社'}, {'title': 'JQure', 'pu
b': '机械工业出版社'}, {'title': 'Linux', 'pub': '机械工业出版社'}, {'title': 'HTML5', 'pub': '清华大学出版社'}]>
values_list(‘列1’,‘列2’)
用法:MyModel.objects.values_list(…)
作用:查询部分列并返回元组对象
返回值:QuerySet内容为元组
In [3]: b1 = Book.objects.values_list('title','price')
In [4]: b1
Out[4]: <QuerySet [('Python', Decimal('20.00')), ('Java', Decimal('25.00')), ('Django', Decimal('70.00')), ('JQure', Decimal('90.00')), ('Linux', Decimal('80.00')), ('HTML5', Decimal
('90.00'))]>
In [5]: for i in b1:
...: print(i)
...:
('Python', Decimal('20.00'))
('Java', Decimal('25.00'))
('Django', Decimal('70.00'))
('JQure', Decimal('90.00'))
('Linux', Decimal('80.00'))
('HTML5', Decimal('90.00'))
order_by(‘列1’,‘列2’)
用法:MyModel.objects.order_by(…)
作用:查询部分列,并进行排序,默认为升序排序,如果想进行降序排序,需要在列的前面加上-号
只要返回值是QuerySet就可以进行order_by()排序
In [9]: b2 = Book.objects.order_by('-price')
In [10]: for i in b2:
...: print("书名为",i.title,"价格为:",i.price)
...:
书名为 JQure 价格为: 90.00
书名为 HTML5 价格为: 90.00
书名为 Linux 价格为: 80.00
书名为 Django 价格为: 70.00
书名为 Java 价格为: 25.00
书名为 Python 价格为: 20.00
# 按照价格的降序排序
例题:
创建一个网站,可以显示我们当前数据库中book表中的所有数据
- 在bookstores中的views.py中实现函数
def get_book(requests):
from .models improt Book
all_book = Book.objects.all()
return render(requests, 'all_book.html', locals())
- 在bookstore目录下创建一个templates模板目录,再创建一个all_book.html文件
- 在html文件中进行for标签的使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>获取数据库中的所有书名数据</title>
</head>
<body>
<table border="4">
<tr>
<th>id</th>
<th>title</th>
<th>pub</th>
<th>price</th>
<th>market_price</th>
<th>option</th>
</tr>
{% for book in all_book %}
<tr>
<th>{{ book.id }}</th>
<th>{{ book.title }}</th>
<th>{{ book.pub }}</th>
<th>{{ book.price }}</th>
<th>{{ book.mark_price }}</th>
<th>
<a href="">删除</a>
<a href="">更新</a>
</th>
</tr>
{% endfor %}
</table>
</body>
</html>
- 在主路由中创建一个新的path包含应用bookstore
path('bookstore/',include('bookstore.urls'))
- 在bookstore中创建一个urls,并向其中添加urlpatterns参数,并加入新的path
from . import views
from django.urls import path
urlpatterns = [
path('all_book/',views.get_book),
]
这样就可以凭借127.0.0.1:8000/bookstore/all_book/来访问页面了