day52:django:ORM单表/多表操作
发布时间:2020-12-20 09:57:26 所属栏目:Python 来源:网络整理
导读:目录 1.ORM 2.ORM单表增删改查 13个必知必会的查询接口 filter基于双下划线的模糊查询 3.ORM多表增删改查 ORM 什么是ORM? ORM(object relational mapping) 对象关系映射,做数据库操作的 ORM中的对象关系映射 ORM的实际使用 1.首先,我们在django项目的app01/
目录1.ORM 2.ORM单表增删改查 13个必知必会的查询接口 filter基于双下划线的模糊查询 3.ORM多表增删改查 ORM什么是ORM?ORM(object relational mapping) 对象关系映射,做数据库操作的 ORM中的对象关系映射ORM的实际使用1.首先,我们在django项目的app01/models.py中写入如下内容 class Book(models.Model): # id 这行可写可不写,如果不写的话,系统也会自动添加上去 id = models.AutoField(primary_key=True) id int primary key auto_increment, title = models.CharField(max_length=32) title varchar(32) price = models.DecimalField(max_digits=5,decimal_places=2) price decimal(5,2) 999.99 pub_date = models.DateField() pub_date date publish = models.CharField(max_length=32) 2.执行数据库同步指令,在项目根目录下面执行 python manage.py makemigraitons
python manage.py migrate
Tip:查看FIeld和mysql中的字段关系对比C:ProgramDataAnaconda3Libsite-packagesdjangodbbackendsmysqlbase.py 具体内容大致如下 _data_types = { 'AutoField': integer AUTO_INCREMENT',BigAutoFieldbigint AUTO_INCREMENTBinaryFieldlongblobBooleanFieldboolCharFieldvarchar(%(max_length)s)CommaSeparatedIntegerFieldDateFielddateDateTimeFielddatetimeDecimalFieldnumeric(%(max_digits)s,%(decimal_places)s)DurationFieldbigintFileFieldFilePathFieldFloatFielddouble precisionIntegerFieldintegerBigIntegerFieldIPAddressFieldchar(15)GenericIPAddressFieldchar(39)NullBooleanFieldOneToOneFieldPositiveIntegerFieldinteger UNSIGNEDPositiveSmallIntegerFieldsmallint UNSIGNEDSlugFieldSmallIntegerFieldsmallintTextFieldlongtextTimeFieldtimeUUIDFieldchar(32)DATABASES = { default: { ENGINEdjango.db.backends.mysqlNAMEdb01HOST':127.0.0.1PORT':3306USERrootPASSWORD123 } } 3.在项目主目录下面的init文件中写上如下内容 import pymysql pymysql.install_as_MySQLdb() 注意:前提是需要安装pymysql : pip install pymysql 4.在pycharm中连接mysql,可以使用pycharm自带的sql可视化工具 在说增删改查之前,先介绍几个简单的查询接口all() '''获取表中所有数据,结果为queryset类型''' ret = models.Book.objects.all() filter() 获取部分数据,1)"> ret = models.Book.objects.filter(title=西游记) get() 获取单条数据,结果是model对象 ret = models.Book.objects.get(title=) 关于get需要注意的点''' 1. get() 获取有且只能有一条 # 2.找不到会报错:Book matching query does not exist. 3.结果超过1条也报错: get() returned more than one Book -- it returned 3! 单表操作:增方式1 obj = models.Book( obj就是一个普通的类对象 title= pub_date='2000-08-12',# 可以直接写固定时间,也可以写datetime当前时间 pub_date=datetime.datetime.now(),时间日期类型 publish=人民出版社 注意:必须要写save选项 方式2 obj = models.Book.objects.create( obj是当前创建的新的记录对象 title=红楼梦 pub_date=datetime.datetime.now(),1)"> 时间日期类型 publish=批量添加 obj_list = [] 创建一个空列表,用来存放类对象 for i in range(1,4): 创建4个类对象,每个对象都有4个字段 obj = models.Book( title=水浒传' + str(i),price=i,pub_date=f2000-08-1{i}夕阳红出版社 将类对象添加到列表中 models.Book.objects.bulk_create(obj_list) 批量添加 单表操作:删query类型数据和模型类对象都可以调用delete方法来进行删除 models.Book.objects.filter(title=).delete() models.Book.objects.get(id=3).delete() 单表操作:改models.Book.objects.filter(id=4).update( title= obj = models.Book.objects.get(id=6) obj.price = 18 找到model对象,使用model对象.属性修改值 obj.save() obj.update() 注意:模型类对象不能直接使用update方法 单表查询:查13个必知必会的查询接口前面已经提到了3个简单的查询接口,加上它们,一共有13个查询接口 all() models.Book.objects.all() filter基于双下划线的模糊查询1.按日期查询 ret = models.Book.objects.filter(pub_date__year=2000812) 2.以..开头/结尾 ret = models.Book.objects.filter(title__startswith=少妇 以..开头(区分大小写) ret = models.Book.objects.filter(title__istartswith=py 以..开头(不区分大小写) ret = models.Book.objects.filter(title__endswith=2 以..结尾(区分大小写) 3.包含 ret = models.Book.objects.filter(title_icontains=python title值中包含python的(区分大小写) ret = models.Book.objects.filter(title__icontains=') title值中包含python的(不区分大小写) 4.数字等于.../数字在某个范围内 ret = models.Book.objects.filter(price__in=[3,4]) 等于3或者等于4 -- 3 or4 ret = models.Book.objects.filter(price__range=[1,3]) 在1-3之间 between 1 and 3 5.年份写纯数字和字符串数字都可以 ret = models.Book.objects.filter(pub_date__year=2018) ret = models.Book.objects.filter(pub_date__year=2018) 6.大于/大于等于/小于/小于等于 ret = models.Book.objects.filter(price__gt=3) 价格大于3的 ret = models.Book.objects.filter(price__gte=3) 价格大于等于3的 ret = models.Book.objects.filter(price__lt=3) 价格小于3的 ret = models.Book.objects.filter(price__lte=3) 价格小于等于3的 ORM多表关系的增删改查ORM多表关系的创建from django.db models 作者表 class Author(models.Model): 比较常用的信息放到这个表里面 name=models.CharField( max_length=32) age=models.IntegerField() int 与AuthorDetail建立一对一的关系,一对一的这个关系字段写在两个表的任意一个表里面都可以 ad = models.OneToOneField(to="AuthorDetail",to_field=models.CASCADE) 作者详细信息表 class AuthorDetail(models.Model): 不常用的放到这个表里面 birthday=models.DateField() telephone=models.CharField(max_length=11) addr=models.CharField(max_length=64 出版社表 Publish(models.Model): name=models.CharField( max_length=32) city=models.CharField( max_length=32 书籍表 Book(models.Model): title = models.CharField( max_length=32) publishDate=models.DateField() price=models.DecimalField(max_digits=5,decimal_places=2 publish=models.ForeignKey(to="Publish",to_field="id",on_delete=models.CASCADE) publish=models.ForeignKey(to=Publish") 默认级联删除,默认关联的是另外一张表的id字段 authors=models.ManyToManyField(to=Author自动创建第三张表,id author_id book_id,不会作为本表的字段出现 创建字段的一些参数讲解1.null 如果为True,Django 将用NULL 来在数据库中存储空值。 默认值是 False.''' 2.blank 如果为True,该字段允许不填。默认为False。 要注意,这与 null 不同。null纯粹是数据库范畴的,而 blank 是数据验证范畴的。 如果一个字段的blank=True,表单的验证将允许该字段是空值。如果字段的blank=False,该字段就是必填的。 ''' 3.default 字段的默认值。可以是一个值或者可调用对象。如果可调用 ,每有新对象被创建它都会被调用,如果你的字段没有设置可以为空,那么将来如果我们后添加一个字段,这个字段就要给一个default值 4.primary_key 如果为True,那么这个字段就是模型的主键。如果你没有指定任何一个字段的primary_key=True, Django 就会自动添加一个IntegerField字段做为主键,所以除非你想覆盖默认的主键行为, 否则没必要设置任何一个字段的primary_key=True。 ''' 5.unique 如果该值设置为 True,这个数据字段的值在整张表中必须是唯一的 6.choices 由二元组组成的一个可迭代对象(例如,列表或元组),用来给字段提供选择项。 如果设置了choices ,默认的表单将是一个选择框而不是标准的文本框,<br>而且这个选择框的选项就是choices 中的选项。 7.db_index 如果db_index=True 则代表着为此字段设置数据库索引 DatetimeField、DateField、TimeField这个三个时间字段,都可以设置如下属性。 8.auto_now_add 配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库 9.auto_now 配置上auto_now=True,每次更新数据记录的时候会更新该字段,标识这条记录最后一次的修改时间''' Tip:关于choices属性额外的补充sex = models.IntegerField(choices=((1,1)">男性'),(2,1)">女性))) 1.数据库里面存的是1或者2 2.通过model模型类对象.get_属性名称_display()可以获取到数字对应的文本内容 Tip:关于auto_now_add和auto_now属性额外的补充t1(models.Model): d1 = models.DateTimeField(auto_now_add=True,null=True) 自动添加创建记录的时间 d2 = models.DateTimeField(auto_now=True,null=True) 自动添加创建记录的时间,更新记录是也能自动更新为最新时间 1.auto_now 自动更新时间只有在save更新时才生效,update不生效 2.所以如果要做更新时间的处理,那么最好手动获取当前时间并修改 多表操作:增一对一 1.用create增 models.AuthorDetail.objects.create( birthday=2018-01-0113800000000北京 ) ad_obj = models.AuthorDetail.objects.get(id=1) 创建一对一的关联model对象 models.Author.objects.create( name=张三 ad=ad_obj,# 方法一:写关联对象 ad_id=2,1)"> 方法二:直接写关联id值 ) 2.用类对象去增 ad_obj = models.AuthorDetail.objects.get(id=4) obj= models.Author( name=杨浩=ad_obj,1)"> 方法一 ad_id=3,# 方法二 ) obj.save() 一对多 出版社和书是一对多的关系;一个出版社可以出版多本书 一对多,在多的一方写关联语句 models.Book.objects.create( title=2018-08-08 publishs=models.Publish.objects.get(id=1),# 方法一 publishs_id=1,1)"> 方法二 ) 多对多 书和作者是多对多的关系;一本书可以有多个作者,一个作者也可以写很多本书 obj = models.Book.objects.filter(id=1).first() 方法一:通过get(id=?)获取对象 a1 = models.Author.objects.get(id=1) a2 = models.Author.objects.get(id=2) obj.authors.add(a1,a2) 方法二:add中直接写id obj.authors.add(1,2 方法三:id写入列表中,用*号打散 obj.authors.add(*[1,2]) 多表操作:删一对一和一对多删除 一对一和一对多,基本和单表一样(级联删除) models.Author.objects.get(id=1).delete() models.AuthorDetail.objects.get(id=2).delete() models.Book.objects.get(id=1).delete() 多对多删除 ret = models.Book.objects.get(id=2) ret.authors.clear() 清空该书籍对应的第三张表中的记录(全部删除) ret.authors.remove(3,4) 指定删除该书和哪些作者的关系 (指定删除) ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 02_opencv_python_图像处理进阶
- 【Python functools.partial 偏函数】 -- 2019-08-09 12:09
- python – 如何获取List元素的引用?
- python numpy检测并消除不需要的值
- python – ImportError:无法导入名称’app’
- python – Sublime Text 2 API在编辑器启动时运行nodejs脚本
- Python xlwt设置excel单元格字体及格式
- python 字典的打印实现
- python – 是否有numpy.all()的反转版本?
- python – 对于memoized递归与迭代,Big O表示法是否相同?