Django学习ORM框架笔记
第一步: 创建数据库【不能使用Django
创建】
create database web DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
第二步: 创建数据库的表【可以使用Django
创建,如下自定义类即可】
from django.db import models # 导入模块
# Create your models here.
# 创建表
class UserInfo(models.Model):
name = models.CharField(verbose_name='用户名称', max_length=32)
password = models.CharField(verbose_name='用户密码', max_length=64)
age = models.IntegerField(verbose_name='年龄', default=2)
# data = models.DateField(null=True,blank=True)
class Department(models.Model):
title = models.CharField(max_length=16)
class Role(models.Model):
caption = models.CharField(max_length=16)
'''
/*DDL 信息*/------------
CREATE TABLE `app01_userinfo` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL,
`password` varchar(64) NOT NULL,
`age` int NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
'''
# 添加数据
# UserInfo.objects.create(name="admin1")
第二步: 增加数据表内容【可以使用Django
】
批量创建
Author.objects.bulk_create([
Author(name='Jack'),
Author(name='Rose'),
])
bulk_create()
函数
bulk_create
(objs, batch_size=None, ignore_conflicts=False)- 此方法以有效的方式将所提供的对象列表插入数据库中(通常只有1个查询,无论存在多少个对象),并以与所提供的顺序相同的顺序将创建的对象返回:
>>> objs = Entry.objects.bulk_create([
... Entry(headline='This is a test'),
... Entry(headline='This is only a test'),
... ])
不过这有一些注意事项:
-
模型的
save()
方法将不会被调用,pre_save
和post_save
信号将不会被发送。 -
在多表继承的情况下,它不能与子模型一起工作。
-
如果模型的主键是一个
AutoField
,那么主键属性只能在某些数据库(目前是 PostgreSQL 和 MariaDB 10.5+)上被检索到。在其他数据库上,它将不会被设置。 -
对于多对多的关系,它是行不通的。
-
它将
objs
转换为一个列表,如果objs
是一个生成器,则完全执行objs
。这种转换允许检查所有对象,因此任何具有手动设置主键的对象都可以首先插入。如果你想分批插入对象,而不一次性执行整个生成器,你可以使用这种技术,只要对象没有任何手动设置的主键:from itertools import islice batch_size = 100 objs = (Entry(headline='Test %s' % i) for i in range(1000)) while True: batch = list(islice(objs, batch_size)) if not batch: break Entry.objects.bulk_create(batch, batch_size)
batch_size
参数控制在一次查询中创建多少对象。默认情况是在一个批次中创建所有对象,但 SQLite 除外,默认情况是每个查询最多使用 999 个变量。
在支持它的数据库上(除了Oracle),将 ignore_conflicts
参数设置为 True
告诉数据库忽略插入任何不合格的约束条件的行,如重复的唯一值。启用该参数会禁用在每个模型实例上设置主键(如果数据库正常支持的话)。
警告
在 MySQL 和 MariaDB 上,将 ignore_conflicts
参数设置为 True
将某些类型的错误,除了重复键之外,变成警告。即使在严格模式下也是如此。例如:无效值或不可空值违规。更多细节请参见 MySQL documentation 和 MariaDB documentation 。
-
新建数据(四种方法)
-
方法 1:
Author.objects.create(name="zuozhe", email="zuozheyouxiang@163.com")
-
方法 2:
z_e = Author(name="zuo_zhe", email="zuozhe_email@163.com")
z_e .save()
-
方法 3:
z_e = Author()
z_e .name="zuozhe"
z_e.email="zuozhe_email@163.com"
z_e .save()
-
方法 4:首先尝试获取,不存在就创建,可以防止重复
`Author.objects.get_or_create(name="zuozhe", email="zuozhe_email@163.com")`
此方法返回值(object, True/False)
-
备注:前三种方法返回的都是对应的 object,最后一种方法返回的是一个元组,
(object, True/False),创建时返回 True, 已经存在时返回 False
...待续
-
删除数据
-
修改数据
-
查询数据