陶瓷刀具网站策划书,手机电视直播网站大全,企业全网推广,wordpress缩略图裁剪模型层回顾#xff1a;基本使用 # 模型层有orm框架#xff1a;对象关系映射 数据库中#xff1a;一个个表 #xff1a;user表#xff0c;book表#xff0c;一条条的记录 程序中#xff1a;一个个类#xff0c;一个个对象 数据库中一张表----程序中一个…模型层回顾基本使用 # 模型层有orm框架对象关系映射 数据库中一个个表 user表book表一条条的记录 程序中一个个类一个个对象 数据库中一张表----程序中一个类 数据库中一条记录----对应程序中一个对象 迁移数据库 models.py
from django.db import models
# 写一个个类
class Book(models.Model):id models.AutoField(primary_keyTrue)title models.CharField(max_length64, nullFalse)price models.DecimalField(max_digits7, decimal_places2)
# 执行命令
python manage.py makemigrations
python manage.py migrate 常用和非常用字段(熟悉) # 数据库表中字段有很多类型 : intvarchartext 数据库表中字段有很多类型 AutoField(Field)-int自增列必须填入参数 primary_keyTrue
BigAutoField(AutoField)-bigint自增列必须填入参数 primary_keyTrueSmallIntegerField(IntegerField)-小整数 -32768 32767
PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)-正小整数 0 32767
IntegerField(Field)- 整数列(有符号的) -2147483648 2147483647
PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)- 正整数 0 2147483647
BigIntegerField(IntegerField)- 长整型(有符号的) -9223372036854775808 9223372036854775807BooleanField(Field)- 布尔值类型
NullBooleanField(Field)- 可以为空的布尔值CharField(Field)- 字符类型- 必须提供max_length参数 max_length表示字符长度
TextField(Field)- 文本类型
FileField(Field)- 字符串路径保存在数据库文件上传到指定目录- 参数:upload_to 上传文件的保存路径storage None 存储组件默认django.core.files.storage.FileSystemStorageEmailField(CharField) - 字符串类型Django Admin以及ModelForm中提供验证机制
IPAddressField(Field)- 字符串类型Django Admin以及ModelForm中提供验证 IPV4 机制
URLField(CharField)- 字符串类型Django Admin以及ModelForm中提供验证 URL
SlugField(CharField)- 字符串类型Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符减号
CommaSeparatedIntegerField(CharField)- 字符串类型格式必须为逗号分割的数字
UUIDField(Field)- 字符串类型Django Admin以及ModelForm中提供对UUID格式的验证
FilePathField(Field) - 字符串Django Admin以及ModelForm中提供读取文件夹下文件的功能 - 参数path, 文件夹路径matchNone, 正则匹配recursiveFalse, 递归下面的文件夹allow_filesTrue, 允许文件allow_foldersFalse, 允许文件夹ImageField(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-DD
TimeField(DateTimeCheckMixin, Field)- 时间格式 HH:MM[:ss[.uuuuuu]]
DurationField(Field)- 长整数时间间隔数据库中按照bigint存储ORM中获取的值为datetime.timedelta类型FloatField(Field)- 浮点型
BinaryField(Field)- 二进制类型
DecimalField(Field) - 10进制小数- 参数max_digits小数总长度decimal_places小数位长度 常用非常用字段参数 null如果为TrueDjango 将用NULL 来在数据库中存储空值默认值是 False.blank: 后台管理用的少,如果为True该字段允许不填。默认为False。 要注意这与 null 不同。null纯粹是数据库范畴的而 blank 是数据验证范畴的。 如果一个字段的blankTrue表单的验证将允许该字段是空。 如果字段的blankFalse该字段就是必填的。 default字段的默认值。可以是一个值或者可调用对象。 如果可调用 每有新对象被创建它都会被调用。 primary_key如果为True那么这个字段就是模型的主键。 如果你没有指定任何一个字段的primary_keyTrueDjango 就会自动添加一个IntegerField字段做为主键所以除非你想覆盖默认的主键行为否则没必要设置任何一个字段的primary_keyTrue。unique如果该值设置为 True, 这个数据字段的值在整张表中必须是唯一的 db_index 该字段建立索引 choices 由二元组组成的一个可迭代对象例如列表或元组用来给字段提供选择项。 如果设置了choices 默认的表单将是一个选择框而不是标准的文本框br而且这个选择框的选项就是choices 中的选项。 from django.db import models
class Person(models.Model):# 每个元组的第二个元素用来在amdin管理界面显示而第一个元素才是被存入数据库中的值SHIRT_SIZES ((S, Small),(M, Medium),(L, Large),)name models.CharField(max_length60)shirt_size models.CharField(max_length1, choicesSHIRT_SIZES)
p Person(nameFred Flintstone, shirt_sizeL)
p.save()
p.shirt_size #L
p.get_shirt_size_display() # Large取值# 关于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配置 # orm 可以操作sqlitemysqloraclepostgresql... # 配置文件中的配置: 默认配置操作sqlite: DATABASES {default: {ENGINE: django.db.backends.sqlite3,NAME: BASE_DIR / db.sqlite_lqz,}
} 操作mysql: DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: day05,HOST:127.0.0.1,PORT:3306,USER:root,PASSWORD:JIAJIA,}
} #装模块pymsql模块mysqlclient pip3 install mysqlclient #其他不需要任何操作----有可能在你机器装不上mac
pip3 install pymysql --upgrade # 更新最新版本 # 保证它执行放在配置文件中__init__.py import pymysql
pymysql.install_as_MySQLdb() 基本操作(增删改查) # 增加删除字段只需要在表模型增加注释字段增加删除字段参数再迁移就可以了 增加表记录
# 方案一
Book.object.create()
#方案二
bookBook(参数)
book.save() # 不要轻易删除迁移记录 # 删除方式一查出来再删
Book.objects.all().delete()
# 删除方式二可以重写类中得delete方法
bookBook.objects.filter(pk1).first()
book.delete() #Book 类中有个delete方法咱们没有写---》父类的--》可以重写 # 更新 # 更新方式一查出来再删
Book.objects.all().update()
# 更新方式二
bookBook.objects.filter(pk1).first()
book.namess
book.save() #查 all(): 查询所有结果
filter(**kwargs): 它包含了与所给筛选条件相匹配的对象
get(**kwargs): 返回与所给筛选条件相匹配的对象返回结果有且只有一个如果符合筛选条件的对象超过一个或者没有都会抛出错误。
exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象
order_by(*field): 对查询结果排序(-id)
reverse(): 对查询结果反向排序
count(): 返回数据库中匹配查询(QuerySet)的对象数量。
first(): 返回第一条记录
last(): 返回最后一条记录
exists(): 如果QuerySet包含数据就返回True否则返回False
values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet运行后得到是一个可迭代的字典序列
values_list(*field): 它与values()非常相似它返回的是一个元组序列values返回的是一个字典序列
distinct(): 从返回结果中剔除重复纪录 多表操作-创建关系 class Book(models.Model):name models.CharField(max_length32)price models.DecimalField(max_digits5, decimal_places2)publish_date models.DateField()publish models.ForeignKey(toPublish,on_deletemodels.CASCADE)#这不是个字段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的参数models.CASCADE 级联删除删除出版社当前出版社下所有的图书数据都会被删除models.SET_NULL 删除出版社当前出版社下所有的图书数据publish_id字段都是置为空models.SET_DEFAULT 删除出版社出版社下所有图书数据publish_id字段都设为默认值models.SET(值/可调用对象) 删除出版社当前出版社下所有的图书数据都会的publish_id字段都设为SET传入的值如果是可调用对象会执行可调用对象把return传入models.DO_NOTHING publish_id字段原封不动 publish models.ForeignKey(toPublish,on_deletemodels.SET_NULL,nullTrue)
publish models.ForeignKey(toPublish,on_deletemodels.SET_DEFAULT,default1)
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.继续往后点击
publishbook.pulish # 有正向查询和 反向查询---》拿到的都是对象 正向当前表中有那个字段类似于book.pulish author.author_detail 通过字段 反向当前表中没有那个字段 author_detail.author 通过author_detail拿到author 通过表名小写 # 一对一正反向 text_use.py
import os
os.environ.setdefault(DJANGO_SETTINGS_MODULE, check_table.settings)
import django
django.setup()
from app01.models import Book,Author,AuthorDatail,Publish
if __name__ __main__:# 一对一正反向# 正向author Author.objects.all().first()print(author.author_detail.addr)# 反向author_datail AuthorDatail.objects.filter(pk2).first()author author_datail.author.name# telephone author_datail.telephone# addr author_datail.addrprint(author) # 一对多正反向 if __name__ __main__:# 正向book Book.objects.all().first()publish book.publish.nameprint(publish)# 反向publish Publish.objects.filter(pk2).first()book publish.book_set.all()# print(book) #QuerySet [Book: 西游记, Book: 红楼梦]print(book) # QuerySet [Book: 三国演义] # 多对多正反向 正向 拿到当前图书所有作者 反向 拿到当前作者写的所有图书 if __name__ __main__:# 多对多# 正向book Book.objects.filter(pk3).first()author book.authors.all()print(author)# 反向author Author.objects.filter(pk1).first()book author.book_set.all()print(book) #QuerySet [Book: 西游记, Book: 三国演义] 基于链表的跨表查询 # 一对一链表- 正反向 import os
os.environ.setdefault(DJANGO_SETTINGS_MODULE, check_table.settings)
import django
django.setup()
from app01.models import Book,Author,AuthorDatail,Publish
if __name__ __main__:# 一对一链表---拿出id为1的作者的地址# 通过__链表# 正向res Author.objects.filter(pk1).values(id,name,author_detail__addr)print(res)# 反向res AuthorDatail.objects.filter(addr上海).values(addr,author__name)print(res) #QuerySet [{addr: 上海, author__name: 周佳祺}] # 一对多正反向 if __name__ __main__:# 正向# 查询上海出版社出版过的所有书籍的名字与价格(一对多)res Publish.objects.filter(name上海出版社).values(name,book__name,book__price)print(res)# 反向res Book.objects.filter(pk1).values(id,publish__name)print(res) # 多对多关系 if __name__ __main__:# 查询周佳祺出过的所有书籍的名字(多对多)# 正向res Author.objects.filter(name周佳祺).values(name,book__name)print(res) #QuerySet [{name: 周佳祺, book__name: 西游记}, {name: 周佳祺, book__name: 三国演义}]# 反向res Book.objects.filter(name西游记).values(name,authors__name)print(res) #### # 查询红楼梦这本书出版社的名字#### # 查询上海出版社出版过的所有书籍的名字以及作者的姓名 if __name__ __main__:# 查询上海出版社出版过的所有书籍的名字以及作者的姓名# 正向res Publish.objects.filter(name上海出版社).values(book__name,book__authors__name)print(res)# 反向res Book.objects.filter(name西游记).values(authors__name,authors__author_detail__telephone)print(res) 表查询练习 查询红楼梦这本书出版社的名字 查询红楼梦这本书出版社的名字 手机号以151开头的作者出版过的所有书籍名称以及出版社名称 查询手机号以33开头的作者出版过的书籍名称以及书籍出版社名 查找所有书名里包含红楼的书 查找出版日期是2017年的书 查找出版日期是2017年的书名 查找价格大于10元的书 查找价格大于10元的书名和价格 查找在北京的出版社 查找名字以沙河开头的出版社 查找作者名字里面带“小”字的作者 查找年龄大于30岁的作者 查找手机号是155开头的作者 查找手机号是155开头的作者的姓名和年龄 查找书名是“红楼梦”的书的出版社 查找书名是“红楼梦”的书的出版社所在的城市 查找书名是“红楼梦”的书的出版社的名称 查找书名是“红楼梦”的书的所有作者 查找书名是“红楼梦”的书的作者的年龄 查找书名是“红楼梦”的书的作者的手机号码 查找书名是“红楼梦”的书的作者的地址 查找书名是“红楼梦”的书的作者的邮箱 今日思维导图