做网站的去哪找客户,上海网站建设索王道下拉,集团网站建设活动方案,石家庄网站seo服务目录
一、基本使用
1、ORM框架
2、创建表
二、常用和非常用字段
三、常用和非常用字段参数
四、settings配置
五、基本操作
5.1 增加表记录
5.2 删除表纪录
5.3 更新表纪录
5.4 查询表纪录
六、 多表操作-创建关系
七、基于对象的跨表查询
八、基于链表的跨表…目录
一、基本使用
1、ORM框架
2、创建表
二、常用和非常用字段
三、常用和非常用字段参数
四、settings配置
五、基本操作
5.1 增加表记录
5.2 删除表纪录
5.3 更新表纪录
5.4 查询表纪录
六、 多表操作-创建关系
七、基于对象的跨表查询
八、基于链表的跨表查询 一、基本使用
1、ORM框架
ORM ---- 对象-关系映射
数据库中一个个表 user表book表一条条的记录程序中一个个类一个个对象 以后数据库中一张表 -----对应程序中一个类以后数据库中一条记录 ----对应程序中一个对象 2、创建表
在models.py中写一个个类
from django.db import models# Create your models here.
# 写一个个类
import datetime
class Book1(models.Model):id models.AutoField(primary_keyTrue) # 自增 primary_keyTrue不写默认为主键title models.CharField(max_length64, db_indexTrue)# db_indexTrue表示索引price models.DecimalField(max_digits7, decimal_places2)# DecimalField(Field) --- 10进制小数# max_digits表示最大位数 decimal_places表示小数点后几位
映射到sqlite中
# 执行命令
python manage.py makemigrations
python manage.py migrate
二、常用和非常用字段
AutoField(Field)- int自增列必须填入参数 primary_keyTrueBigAutoField(AutoField)- bigint自增列必须填入参数 primary_keyTrue注当model中如果没有自增列则自动会创建一个列名为id的列from django.db import modelsclass UserInfo(models.Model):# 自动创建一个列名为id的且为自增的整数列username models.CharField(max_length32)class Group(models.Model):# 自定义自增列nid models.AutoField(primary_keyTrue)name models.CharField(max_length32)
SmallIntegerField(IntegerField):- 小整数 -32768 32767PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)- 正小整数 0 32767
IntegerField(Field)- 整数列(有符号的) -2147483648 2147483647PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)- 正整数 0 2147483647BigIntegerField(IntegerField):- 长整型(有符号的) -9223372036854775808 9223372036854775807BooleanField(Field)- 布尔值类型NullBooleanField(Field):- 可以为空的布尔值CharField(Field)- 字符类型- 必须提供max_length参数 max_length表示字符长度TextField(Field)- 文本类型EmailField(CharField)- 字符串类型Django Admin以及ModelForm中提供验证机制IPAddressField(Field)- 字符串类型Django Admin以及ModelForm中提供验证 IPV4 机制URLField(CharField)- 字符串类型Django Admin以及ModelForm中提供验证 URLSlugField(CharField)- 字符串类型Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符减号CommaSeparatedIntegerField(CharField)- 字符串类型格式必须为逗号分割的数字UUIDField(Field)- 字符串类型Django Admin以及ModelForm中提供对UUID格式的验证FilePathField(Field)- 字符串Django Admin以及ModelForm中提供读取文件夹下文件的功能- 参数path, 文件夹路径matchNone, 正则匹配recursiveFalse, 递归下面的文件夹allow_filesTrue, 允许文件allow_foldersFalse, 允许文件夹FileField(Field)- 字符串路径保存在数据库文件上传到指定目录- 参数upload_to 上传文件的保存路径storage None 存储组件默认django.core.files.storage.FileSystemStorageImageField(FileField)- 字符串路径保存在数据库文件上传到指定目录- 参数upload_to 上传文件的保存路径storage None 存储组件默认django.core.files.storage.FileSystemStoragewidth_fieldNone, 上传图片的高度保存的数据库字段名字符串height_fieldNone 上传图片的宽度保存的数据库字段名字符串DateTimeField(DateField)- 日期时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]DateField(DateTimeCheckMixin, Field)- 日期格式 YYYY-MM-DDTimeField(DateTimeCheckMixin, Field)- 时间格式 HH:MM[:ss[.uuuuuu]]DurationField(Field)- 长整数时间间隔数据库中按照bigint存储ORM中获取的值为datetime.timedelta类型FloatField(Field)- 浮点型DecimalField(Field)- 10进制小数- 参数max_digits小数总长度decimal_places小数位长度BinaryField(Field)- 二进制类型
三、常用和非常用字段参数
(1)null如果为TrueDjango 将用NULL 来在数据库中存储空值。 默认值是 False.(1)blank 后台管理---》admin中会用我们一般用的少如果为True该字段允许不填。默认为False。
要注意这与 null 不同。null纯粹是数据库范畴的而 blank 是数据验证范畴的。
如果一个字段的blankTrue表单的验证将允许该字段是空值。如果字段的blankFalse该字段就是必填的。(2)default字段的默认值。可以是一个值或者可调用对象。如果可调用 每有新对象被创建它都会被调用。(3)primary_key如果为True那么这个字段就是模型的主键。如果你没有指定任何一个字段的primary_keyTrue
Django 就会自动添加一个IntegerField字段做为主键所以除非你想覆盖默认的主键行为
否则没必要设置任何一个字段的primary_keyTrue。(4)unique如果该值设置为 True, 这个数据字段的值在整张表中必须是唯一的(5)db_index 该字段建立索引(6)choices
由二元组组成的一个可迭代对象例如列表或元组用来给字段提供选择项。 如果设置了choices 默认的表单将是一个选择框而不是标准的文本框br而且这个选择框的选项就是choices 中的选项。
get_type_book_display()# 关于Meta中
class UserInfo(models.Model):nid models.AutoField(primary_keyTrue,indexTrue)username models.CharField(max_length32)mobilemodels.CharField(max_length32)class Meta:# 数据库中生成的表名称 默认 app名称 下划线 类名db_table table_name# 联合索引index_together [(username, mobile),]# 联合唯一索引unique_together ((username, mobile),)# admin中显示的表名称verbose_name图书表# verbose_name加sverbose_name_plural
四、settings配置
若想将模型转为mysql数据库中的表需要在settings中配置
配置文件中的配置
# 默认配置操作sqlite
DATABASES {default: {ENGINE: django.db.backends.sqlite3, NAME: BASE_DIR / db.sqlite_lyj,}
}
# 操作mysql
# 配置文件
DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: day05,HOST:127.0.0.1,PORT:3306,USER:root,PASSWORD:123,}
}NAME:要连接的数据库连接前需要创建好
HOST:连接主机默认本机
PORT:端口 默认3306
USER:连接数据库的用户名
PASSWORD:连接数据库的密码装模块mysqlclient/pymsql模块
pip3 install mysqlclient # 其他不需要任何操作 ----》有可能在mac装不上
需要找到项目名文件下的init,在里面写入
保证它执行放在配置文件中
pip3 install pymysql --upgrade # 强制装最新
import pymysql
pymysql.install_as_MySQLdb()
五、基本操作 新增字段在类里直接新增字段直接执行数据库迁移命令会提示输入默认值此时需要设置 type_book models.IntegerField(choices((1, 技术类), (2, 玄幻类), (3, 科技类)), nullTrue) 删除直接注释掉字段执行数据库迁移命令即可 注不要轻易删除迁移记录 5.1 增加表记录
方式1
Book.object.create()
方式2
book Book(参数)
book.save()
5.2 删除表纪录
方式一查出来再删
Book.objects.all().delete()
方式二可以重写类中得delete方法
book Book.objects.filter(pk1).first()
book.delete() # Book类中有个delete方法我们没有写---》父类的--》可以重写
5.3 更新表纪录
方式一查出来再更新
Book.objects.all().update()
方式二
book Book.objects.filter(pk1).first()
book.name ss
book.save()
5.4 查询表纪录
查询API
1 all(): 查询所有结果2 filter(**kwargs): 它包含了与所给筛选条件相匹配的对象3 get(**kwargs): 返回与所给筛选条件相匹配的对象返回结果有且只有一个如果符合筛选条件的对象超过一个或者没有都会抛出错误。4 exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象5 order_by(*field): 对查询结果排序(-id)6 reverse(): 对查询结果反向排序8 count(): 返回数据库中匹配查询(QuerySet)的对象数量。9 first(): 返回第一条记录10 last(): 返回最后一条记录11 exists(): 如果QuerySet包含数据就返回True否则返回False12 values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet运行后得到的并不是一系列model的实例化对象而是一个可迭代的字典序列
13 values_list(*field): 它与values()非常相似它返回的是一个元组序列values返回的是一个字典序列14 distinct(): 从返回结果中剔除重复纪录
六、 多表操作-创建关系
class Book(models.Model):name models.CharField(max_length32,nullTrue)price models.DecimalField(max_digits5, decimal_places2)publish_date models.DateField(auto_nowTrue)publish models.ForeignKey(toPublish,on_deletemodels.DO_NOTHING,nullTrue,default1,db_constraintFalse)# 这不是个字段authorsmodels.ManyToManyField(toAuthor)def __str__(self):return self.nameclass Author(models.Model):name models.CharField(max_length32)age models.IntegerField()author_detail models.OneToOneField(toAuthorDatail,uniqueTrue,on_deletemodels.CASCADE)class AuthorDatail(models.Model):telephone models.BigIntegerField()birthday models.DateField()addr models.CharField(max_length64)class Publish(models.Model):name models.CharField(max_length32)city models.CharField(max_length32)email models.EmailField()
关联关系有如下几种
一对一本质就是一对多只不过多的字段唯一一对多外键关联多对多必须要有中间表
OneToOneFieldForeignKey 必须写on_delete不写报错
on_delete可选的参数有哪些
1 models.CASCADE 级联删除 删除出版社当前出版社下所有的图书数据都会被删除2 models.SET_NULL 删除出版社 当前出版社下所有的图书数据都会的publish_id字段都是置为空
publish models.ForeignKey(toPublish,on_deletemodels.SET_NULL,nullTrue)
3 models.SET_DEFAULT删除出版社 当前出版社下所有的图书数据都会的publish_id字段都设为默认值
publish models.ForeignKey(toPublish,on_deletemodels.SET_DEFAULT,default1)
4 models.SET(值/可调用对象)删除出版社 当前出版社下所有的图书数据都会的publish_id字段都设为SET传入的值如果是可调用对象会执行可调用对象把return的值放在这里
publish models.ForeignKey(toPublish,on_deletemodels.SET(),nullTrue,default1)
5 models.DO_NOTHING删除出版社 当前出版社下所有的图书数据都会的publish_id字段 原封不动由于有外检字段的约束所以必须加上db_constraintFalse
publish models.ForeignKey(toPublish,on_deletemodels.DO_NOTHING,db_constraintFalse)
七、基于对象的跨表查询
假设拿到book对象
book.name
book.price
book.publish_id ----数字---》出版社id号
---》我们可以通过出版社id再去出版社表查出当前出版社---》很麻烦
快捷方式
book.publish ----拿到的是 publish对象---》当前图书的出版社对象
book.publish.继续往后点击
上面这种查询方式称之为基于对象的跨表查询
对象 对象.字段
publish book.pulish
有正向查询和反向查询 -----》拿到的都是对象
正向当前表中有那个字段类似于book.pulish author.author_detail 通过字段反向当前表中没有那个字段 author_detail.author 通过author_detail拿到author通过表名小写
一对多的正反向
正向简单
publish book.pulish
反向
publish对象 ---》拿到当前publish对象下所有出版过的图书 --反向查询
puhlish.book_set.all() # 如果是反向多条就要用表名小写_set.all()
多对多正反向
正向 拿到当前图书所有作者
book.authors.all() # 正向 --》对象.字段.all()
反向 拿到当前作者写的所有图
author.book_set.all() # 反向--》多条就要用表名小写_set.all()在Python脚本中调用Django环境
import osos.environ.setdefault(DJANGO_SETTINGS_MODULE, django_03.settings)
import djangodjango.setup()
from app01.models import Book, Author, AuthorDatail, Publishif __name__ __main__:
import os
os.environ.setdefault(DJANGO_SETTINGS_MODULE, django_05.settings)
import django
django.setup()
from app01.models import Book,Author,AuthorDatail,Publish
if __name__ __main__:# res Book.objects.all().values(title,price) # select title,price---》qs中套字典 有key有value# res Book.objects.all().values_list(title,price) # select title,price---》qs中套元组只有value# print(res)# 一对一正反向# 正向author Author.objects.all().first()print(author.author_detail.addr)# 反向author_detailAuthorDatail.objects.filter(pk3).first()print(author_detail.author.name)# 一对多# 正向bookBook.objects.all().first()print(book.publish.name)# 反向publishPublish.objects.filter(pk2).first()print(publish.book_set.all())# 多对多# 正向bookBook.objects.filter(pk3).first()bookBook.objects.filter(pk2).first()print(book.authors.all())# 反向authorAuthor.objects.all().first()print(author.book_set.all())
八、基于链表的跨表查询
想把作者和作者详情链接
正author到 author_detail反author_detail到author
### 通过 __ 链表
### 一对一链表- 正反向
# 拿出id为1的作者作者表 的地址作者详情表
# 正向---》字段名 author_detail
resAuthor.objects.filter(pk1).values(id,name,age,author_detail__addr)
print(res)# 反向---》查询 作者地址是 北京 的作者名和作者年龄
# 反向--》表名小写
resAuthorDatail.objects.filter(addr北京).values(addr,author__name,author__age)
print(res)
### 一对多正反向
# 查询北京出版社出版过的所有书籍的名字与价格(一对多)
# 反向表名小写
res Publish.objects.filter(name北京出版社).values(name,book__name,book__price)
print(res)
# 正向按字段
res Book.objects.filter(publish__name北京出版社).values(publish__name,name,price)
print(res)#####查询红楼梦这本书出版社的名字#####
### 多对多关系
# 练习: 查询lqz出过的所有书籍的名字(多对多)
# 反向
resAuthor.objects.filter(namelqz).values(name,book__name)
print(res)
# 正向
resBook.objects.filter(authors__namelqz).values(authors__name,name)
print(res)# 查询北京出版社出版过的所有书籍的名字以及作者的姓名res Publish.objects.filter(name北京出版社).values(book__name,book__authors__name,book__authors__author_detail__addr)
print(res)res Book.objects.filter(publish__name北京出版社).values(name,authors__name)
print(res)res Author.objects.filter(book__publish__name北京出版社).values(book__name,name)
print(res)