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_savepost_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 documentationMariaDB documentation

  1. 新建数据(四种方法)

  2. 方法 1: Author.objects.create(name="zuozhe", email="zuozheyouxiang@163.com")

  3. 方法 2: z_e = Author(name="zuo_zhe", email="zuozhe_email@163.com")
    z_e .save()

  4. 方法 3: z_e = Author()

    z_e .name="zuozhe"

    z_e.email="zuozhe_email@163.com"

    z_e .save()

  5. 方法 4:首先尝试获取,不存在就创建,可以防止重复

  `Author.objects.get_or_create(name="zuozhe", email="zuozhe_email@163.com")`

  此方法返回值(object, True/False)
  1. 备注:前三种方法返回的都是对应的 object,最后一种方法返回的是一个元组,

    (object, True/False),创建时返回 True, 已经存在时返回 False

...待续

  1. 删除数据

  2. 修改数据

  3. 查询数据

posted @ 2022-02-16 13:27  zechariah1  阅读(54)  评论(0编辑  收藏  举报