码迷,mamicode.com
首页 > 数据库 > 详细

Django(三) ORM 数据库操作

时间:2018-07-19 22:03:51      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:protoc   base   group   time   man   sla   param   ret   提前   

大纲

一、DjangoORM 创建基本类型及生成数据库表结构 
1、简介 
2、创建数据库 表结构 
二、Django ORM基本增删改查 
1、表数据增删改查 
2、表结构修改 
三、Django ORM 字段类型 
1、字段类型介绍 
2、字段参数介绍 
3、Django ORM 外键操作

一、DjangoORM 创建基本类型及生成数据库表结构

1、简介

ORM:关系对象映射。定义一个类自动生成数据库的表结构。

创建数据库的时候,一般有以下几种常用数据类型:数字、字符串以及时间。

ORM分为两种:

  • DB First 数据库里先创建数据库表结构,根据表结构生成类,根据类操作数据库
  • Code First 先写代码,执行代码创建数据库表结构

主流的orm都是code first。django 的orm也是code first,所以学的时候,本质就分为两块:

  • 根据类自动创建数据库表
  • 根据类对数据库表中的数据进行各种操作

2、创建数据库 表结构

  • 先写类:

app下models.py文件:

from django.db import models

class UserInfo(models.Model):  # 必须继承models.Model
    # 不写则,django默认创建ID列,自增,主键
    # 用户名列,字符串类型,指定长度
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 注册APP

执行命令python manage.py makemigrations,会提示No changes detected,这是因为:执行命令时会找所有models,但是django不知道找哪个,所有需要指定一下。

settings.py,

INSTALLED_APPS = [
    ‘django.contrib.admin‘,
    ‘django.contrib.auth‘,
    ‘django.contrib.contenttypes‘,
    ‘django.contrib.sessions‘,
    ‘django.contrib.messages‘,
    ‘django.contrib.staticfiles‘,
    ‘app01‘,            # 这里添加app
]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 执行命令生成表结构
python manage.py  makemigrations    # 生成migrations临时文件
python manage.py  migrate           # 根据migrations直接生成数据库
  • 1
  • 2

执行后,从migrations便会产生操作记录。生成数据库,默认情况下用的sqlite3。可以用navicat等软件直接打开。

db.sqlite3里面包含缓存、session、cookie、静态文件以及后台管理。像咱们创建的表名叫:app01_userinfo

  • 连接mysql数据库

如果不使用sqlite,使用mysql数据库。代码不用改、命令也不用改,只需要改下配置文件。

# https://docs.djangoproject.com/en/1.10/ref/settings/#databases  官网文档
# DATABASES = {             # sqlite 默认
#     ‘default‘: {
#         ‘ENGINE‘: ‘django.db.backends.sqlite3‘,
#         ‘NAME‘: os.path.join(BASE_DIR, ‘db.sqlite3‘),
#     }
# }
DATABASES = {               # mysql
    ‘default‘: {
        ‘ENGINE‘: ‘django.db.backends.mysql‘,
        ‘NAME‘: ‘mydatabase‘,
        ‘USER‘: ‘mydatabaseuser‘,
        ‘PASSWORD‘: ‘mypassword‘,
        ‘HOST‘: ‘127.0.0.1‘,
        ‘PORT‘: ‘3306‘,
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

注意:

  • 数据库名django不能创建,需要自己提前创建

  • Django默认使用MySQLdb模块链接MySQL,但python3现在还没有MySQLdb,所以改为用pymysql去连。在project项目名下的__init__.py里面

    import pymysql
    pymysql.install_as_MySQLdb()
    • 1
    • 2

二、Django ORM基本增删改查

1、表数据增删改查

urls.py

    url(r‘^orm/‘, views.orm),
  • 1

app01/views.py

from app01 import models  # 导入models模块
def orm(request):
# 创建数据
    # 第一种方式
    # models.UserInfo.objects.create(username="root",password="123")
    # 第二种方式
    # obj = models.UserInfo(username=‘fzh‘, password="iajtag")
    # obj.save()
    # 第三种方式
    # dic = {‘username‘:‘fgf‘, ‘password‘:‘666‘}
    # models.UserInfo.objects.create(**dic)

# 查询数据
    # result = models.UserInfo.objects.all()  # 查询所有,为QuerySet类型,可理解成列表
    # result = models.UserInfo.objects.filter(username="fgf",password="666")  # 列表
    # result = models.UserInfo.objects.filter(username="fgf").first()  # 对象
    # 条件查询。filter 相当于where查询条件,里面的","会组成and条件
    # for row in result:  # 打印查询到数据。
    #     print(row.id,row.username,row.password)

    # 查看QuerySet类型具体做了什么事情,可以: print(result.query)

# 删除数据
    # models.UserInfo.objects.all().delete()  # 删除所有
    # models.UserInfo.objects.filter(id=4).delete()  # 删除所有

# 更新数据
    # models.UserInfo.objects.all().update(password=8888)
    # models.UserInfo.objects.filter(id=3).update(password=888888)

    return HttpResponse(‘orm‘)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

2、表结构修改

  • 修改列

把最初定义的类中字段password = models.CharField(max_length=64)改为password = models.CharField(max_length=60)。重新执行python manage.py makemigrationspython manage.py migrate,则数据表结构更改了。如果列内内容超过定义大小,则数据就丢了。

  • 增加一列

类中增加一列,执行命令,会有提示信息,因为默认情况下是不允许为空的。这里提供两个选项。

  1. 输入一个值,新增列已存在的行默认加上输入的内容。
  2. email = models.CharField(max_length=32, null=True),允许为空

查看表结构变化时,刷新看不出来,需要重新打开表看效果。

  • 删除列

类内删掉相应的字段,执行命令即可。

三、Django ORM 字段类型

1、字段类型介绍

Django ORM 字段类型中,有CharField、EmailField、URLField、GenericIPAddressField等,实际上在数据库里都是字符串。不能做检查语法,做不了验证。那这个有什么用呢?

这些是给Django 的 admin 用的。在admin那个网页上做验证。如果不用admin,那那些都是字符串,效果都一样。

自定义自增列:models.AutoField(primary_key=True)

1、models.AutoField  自增列 = int(11)
  如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。
2、models.CharField  字符串字段
  必须 max_length 参数
3、models.BooleanField  布尔类型=tinyint(1)
  不能为空,Blank=True
4、models.ComaSeparatedIntegerField  用逗号分割的数字=varchar
  继承CharField,所以必须 max_lenght 参数
5、models.DateField  日期类型 date
  对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。
6、models.DateTimeField  日期类型 datetime
  同DateField的参数
7、models.Decimal  十进制小数类型 = decimal
  必须指定整数位max_digits和小数位decimal_places
8、models.EmailField  字符串类型(正则表达式邮箱) =varchar
  对字符串进行正则表达式
9、models.FloatField  浮点类型 = double
10、models.IntegerField  整形
11、models.BigIntegerField  长整形
  integer_field_ranges = {
    ‘SmallIntegerField‘: (-32768, 32767),
    ‘IntegerField‘: (-2147483648, 2147483647),
    ‘BigIntegerField‘: (-9223372036854775808, 9223372036854775807),
    ‘PositiveSmallIntegerField‘: (0, 32767),
    ‘PositiveIntegerField‘: (0, 2147483647),
  }
12、models.IPAddressField  字符串类型(ip4正则表达式)(已弃用,用13、)
13、models.GenericIPAddressField  字符串类型(ip4和ip6是可选的)
  参数protocol可以是:both、ipv4、ipv6
  验证时,会根据设置报错
14、models.NullBooleanField  允许为空的布尔类型
15、models.PositiveIntegerFiel  正Integer
16、models.PositiveSmallIntegerField  正smallInteger
17、models.SlugField  减号、下划线、字母、数字
18、models.SmallIntegerField  数字
  数据库中的字段有:tinyint、smallint、int、bigint
19、models.TextField  字符串=longtext
20、models.TimeField  时间 HH:MM[:ss[.uuuuuu]]
21、models.URLField  字符串,地址正则表达式
22、models.BinaryField  二进制
23、models.ImageField   图片
24、models.FilePathField 文件
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

如上那么多的字段,可大致分为 字符串、数字、时间、二进制、自增(primary_key=True)几类。

2、字段参数介绍

  • 数据库中的字段参数
null                # 是否可以为空
default             # 默认值
primary_key         # 主键
db_column           # 列名
db_index            # 索引(db_index=True)
unique              # 唯一索引(unique=True)
unique_for_date     # 只对日期索引
unique_for_month    # 只对月份索引
unique_for_year     # 只对年做索引
auto_now            # 创建时,自动生成时间
auto_now_add        # 更新时,自动更新为当前时间
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
        # 更新时间不支持这种
        obj = UserGroup.objects.filter(id=1).update(caption=‘CEO‘)  
        obj = UserGroup.objects.filter(id=1).first()  # 自动更新时间需要这样写
        obj.caption = "CEO"
        obj.save()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 以下是只针对admin的字段参数
choices             # 作用:1、django admin中显示下拉框;2、避免连表查询
  • 1
        user_type_choices = (  # 数据库只存1、2、3,后面的信息存在内存里。
            (1, ‘超级用户‘),
            (2, ‘普通用户‘),
            (3, ‘普普通用户‘),
        )
        user_type_id = models.IntegerField(choices=user_type_choices,default=1)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
blank              # django admin是否可以为空
verbose_name       # django admin显示字段中文
editable           # django admin是否可以被编辑
error_messages     # 错误信息
    # error_messages={"required":"密码不能为空",}  # 注意必须有逗号
help_text          # django admin提示
validators         # django form ,自定义错误信息

python manage.py createsuperuser    # 创建 Django 用户
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

3、Django ORM 外键操作

连表关系之一对多,models.ForeignKey(ColorDic)

models.py

  • 表关联
class UserGroup(models.Model):
    uid = models.AutoField(primary_key=True)
    caption = models.CharField(max_length=32,unique=True)
    ctime = models.DateTimeField(auto_now_add=True, null=True)
    uptime = models.DateTimeField(auto_now=True, null=True)

class UserInfo(models.Model):
    username = models.CharField(max_length=32,blank=True,verbose_name=‘用户名‘)
    password = models.CharField(max_length=60, help_text=‘pwd‘)
    email = models.CharField(max_length=60)
    test = models.EmailField(max_length=19,null=True,error_messages={‘invalid‘: ‘请输入密码‘,})
    # UserInfo表中没有user_group字段,而是 user_group_id 列 值为 uid 数字
    user_group = models.ForeignKey("UserGroup",to_field=‘uid‘)      # 外键关联 **********
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 数据查询
user_list = Userinfo.objects.all()  # 获取Userinfo对象
for row in user_list:               # 
    print(row.user_group_id)        # 数据库里真实存在的数据
    # user_group:代指UserGroup对象。类UserGroup对象里封装了(uid,catption,ctime,uptime)
    print(row.user_group.uid)       # 通过对象获取uid,和user_group_id一样
    print(row.user_group.caption)   # 通过对象获取caption
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 创建数据

UserInfo表创建数据,怎么写呢?

    models.UserInfo.objects.create(
        username=‘root1‘,
        password=‘123‘,
        email="asdfasdf",
        test="asdfasdf",
        # 第一种方式:再次查询数据库,不推荐
        # user_group = models.UserGroup.objects.filter(id=1).first()
        # 第二种方式:通过 外键字段_id
        user_group_id = 1
    )

Django(三) ORM 数据库操作

标签:protoc   base   group   time   man   sla   param   ret   提前   

原文地址:https://www.cnblogs.com/ExMan/p/9338574.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!