自己做的创意的网站,短链接生成站长工具,台州品牌网站设计,网站开发英文参考文献1.1基本使用
orm框架---》对象关系映射 数据库中#xff1a;一个个表 #xff1a;user表#xff0c;book表#xff0c;一条条的记录 程序中#xff1a;一个个类#xff0c;一个个对象 以后数据库中一张表---》对应程序中一个类 以后数据库中一条记录--》对应…1.1基本使用
orm框架---》对象关系映射 数据库中一个个表 user表book表一条条的记录 程序中一个个类一个个对象 以后数据库中一张表---》对应程序中一个类 以后数据库中一条记录--》对应程序中一个对象 数据库表中字段有很多类型 intvarchartext 程序的类中---》字段--》有很多类型 CharField DecimalField 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
2.2 常用和非常用字段
AutoField(Field) int自增列必须填入参数 primary_keyTrue
BigAutoField(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 32767IntegerField(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.FileSystemStorage width_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.3 常用非常用字段参数 null 如果为TrueDjango 将用NULL 来在数据库中存储空值。 默认值是 False.blank 后台管理---》admin中会用咱们一般用的少 如果为True该字段允许不填。默认为False。要注意这与 null 不同。null纯粹是数据库范畴的而 blank 是数据验证范畴的。如果一个字段的blankTrue表单的验证将允许该字段是空值。如果字段的blankFalse该字段就是必填的。default 字段的默认值。可以是一个值或者可调用对象。如果可调用 每有新对象被创建它都会被调用。primary_key 如果为True那么这个字段就是模型的主键。如果你没有指定任何一个字段的primary_keyTrue Django 就会自动添加一个IntegerField字段做为主键所以除非你想覆盖默认的主键行为 否则没必要设置任何一个字段的primary_keyTrue。unique 如果该值设置为 True, 这个数据字段的值在整张表中必须是唯一的db_index 该字段建立索引 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
1.4 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:1234,}
}
装模块pymsql模块mysqlclient pip3 install mysqlclient #其他不需要任何操作----》有可能在你机器装不上macpip3 install pymysql --upgrade# 保证它执行放在配置文件中import pymysqlpymysql.install_as_MySQLdb()
1.5 基本操作(增加删除字段增加记录删除记录查询记录)
增加删除字段只需要在表模型增加注释字段增加删除字段参数再迁移就可以了
不要轻易删除迁移记录
增加表记录 # 方案一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.namessbook.save()
查
all(): 查询所有结果filter(**kwargs): 它包含了与所给筛选条件相匹配的对象get(**kwargs): 返回与所给筛选条件相匹配的对象返回结果有且只有一个如果符合筛选条件的对象超过一个或者没有都会抛出错误。exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象order_by(*field): 对查询结果排序(-id)reverse(): 对查询结果反向排序count(): 返回数据库中匹配查询(QuerySet)的对象数量。first(): 返回第一条记录last(): 返回最后一条记录exists(): 如果QuerySet包含数据就返回True否则返回Falsevalues(*field): 返回一个ValueQuerySet——一个特殊的QuerySet运行后得到的并不是一系列model的实例化对象而是一个可迭代的字典序列
values_list(*field): 它与values()非常相似它返回的是一个元组序列values返回的是一个字典序列distinct(): 从返回结果中剔除重复纪录
1.6 多表操作-创建关系
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可选的参数有哪些
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变5 models.DO_NOTHING 删除出版社---》当前出版社下所有的图书数据都会的publish_id字段 原封不动
publish models.ForeignKey(toPublish,on_deletemodels.DO_NOTHING,db_constraintFalse) 1.7 基于对象的跨表查询
假设拿到book对象 book.namebook.pricebook.publish_id ----数字---》出版社id号---》咱们可以通过出版社id再去出版社表查出当前出版社---》很麻烦-----快捷方式-----book.publish----拿到的是 publish对象---》当前图书的出版社对象book.publish.继续往后点击
上面这种查询方式称之为基于对象的跨表查询 对象对象.字段publishbook.pulish
有正向查询和 反向查询---》拿到的都是对象 -正向当前表中有那个字段类似于book.pulish author.author_detail-通过字段-反向当前表中没有那个字段 author_detail.author 通过author_detail拿到author-通过表名小写
一对多和多对多的正反向 正向简单publishbook.pulish反向publish对象---》拿到当前publish对象下所有出版过的图书--反向查询puhlish.book_set.all() # 如果是反向多条就要用 表名小写_set.all()
多对多正反向 正向 拿到当前图书所有作者book.authors.all() # 正向--》对象.字段.all()反向 拿到当前作者写的所有图书author.book_set.all() #反向--》多条就要用 表名小写_set.all()
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__:resBook.objects.all().values(title,price) # select title,price---》qs中套字典 有key有value
resBook.objects.all().values_list(title,price) # select title,price---》qs中套元组只有valueprint(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())
1.8 基于链表的跨表查询
通过 __ 链表
一对一链表
正向 拿出id为1的作者作者表 的地址作者详情表正向---》字段名 author_detailresAuthor.objects.filter(pk1).values(id,name,age,author_detail__addr)print(res)
反向 反向---》查询 作者地址是 北京 的作者名和作者年龄反向--》表名小写resAuthorDatail.objects.filter(addr北京).values(addr,author__name,author__age)print(res)
一对多 查询北京出版社出版过的所有书籍的名字与价格(一对多) 正向 正 按字段resBook.objects.filter(publish__name北京出版社).values(publish__name,name,price)print(res)反向 反 :表名小写resPublish.objects.filter(name北京出版社).values(name,book__name,book__price)print(res)
查询红楼梦这本书出版社的名字
多对多关系 练习: 查询lqz出过的所有书籍的名字(多对多) 正向
正resBook.objects.filter(authors__namelqz).values(authors__name,name)print(res)
反向 反resAuthor.objects.filter(namelqz).values(name,book__name)print(res)
查询红楼梦这本书出版社的名字 查询北京出版社出版过的所有书籍的名字以及作者的姓名 resPublish.objects.filter(name北京出版社).values(book__name,book__authors__name,book__authors__author_detail__addr)print(res)resBook.objects.filter(publish__name北京出版社).values(name,authors__name)print(res)res Author.objects.filter(book__publish__name北京出版社).values(book__name,name)print(res)