Django model 层之Models与Mysql数据库小结1

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Django model 层之Models与Mysql数据库小结

Django model 层之ModelsMysql数据库小结


 

测试环境:

Python版本:python-3.4.0.amd64

下载地址:https://www.python.org/downloads/release/python-340/

 

 

Win7 64位

 

Django  1.11.4

下载地址:https://www.djangoproject.com/download/

 

 

MySQL数据库为例,假设项目目录结构如下:

mysite/

myapp/

   __init__.py

admin.py

apps.py

migrations/

   __init__.py

models.py

tests.py

views.py

   manage.py

   mysite/

       __init__.py

       settings.py

       urls.py

       wsgi.py

 

 

配置数据库信息

打开项目根目录下,与项目同名的目录,编辑settings.py(例中mysite/mysite/settings.py文件),

找到以下代码

DATABASES = {

'default': {

……略

}

}

 

修改为以下内容:

DATABASES = {

   'default': {

       'ENGINE': 'django.db.backends.mysql',

       'NAME': 'testdb',

       'USER': 'testacc',

       'PASSWORD': 'test1234',

       'HOST': '192.168.1.102',

       'PORT': '3306',

       'OPTION':{

           'init_command': 'SET default_storage_engine=INNODB'

       }

   }

}

 

说明:

ENGINE:默认为空。可选值:

'django.db.backends.postgresql'

'django.db.backends.mysql'

'django.db.backends.sqlite3'

'django.db.backends.oracle'

 

NAME:数据库名字。

如果使用SQLite,数据库文件将存放在电脑上,这种情况下,NAME应该为绝对路径,包含数据库文件的文件名。默认值如下,把数据库文件存放在项目根目录下。

DATABASES = {

   'default': {

       'ENGINE': 'django.db.backends.sqlite3',

       'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),

   }

}

 

如果不使用SQLite,需要设置额外参数如USER, PASSWORDHOST, PORT

 

另外,确保提供的USER具备“create database”权限。

 

USER: 数据库用户名,默认为''

 

PASSWORD:连接数据库用户密码,默认为''

 

HOST: 数据库服务器主机地址,默认为'',代表localhost。支持tcp socket除外的其它socket连接方式,更多详情请查看官方文档。

 

PORT:数据库访问端口,默认为'',代表默认端口。

 

AUTOCOMMIT: 自动提交事务。默认为True。设置为False,则禁用Django 事务管理,采用自己实现的事务管理。

 

更多选项设置,请参考官方文档。

 

参考链接:

https://docs.djangoproject.com/en/1.11/ref/settings/#databases

 

建立表

编辑应用目录下的models.py文件(例中为 mysite/myapp/models.py)

from django.db import models

 

# Create your models here.

class Person(models.Model):

  first_name = models.CharField(max_length=30)

  last_name = models.CharField(max_length=30)

 

新增以上带背景色代码

first_name和last_name为model的field。每个field映射到一个数据库列。

 

以上Person model将创建如下表:

CREATE TABLE myapp_person (

   "id" serial NOT NULL PRIMARY KEY,

   "first_name" varchar(30) NOT NULL,

"last_name" varchar(30) NOT NULL);

 

注意:

1、如上,表名命名方式为应用名称_转为小写的model名称,我们可以通过Meta属性实现表名自定义,如下:

 

CREATE TABLE myapp_person (

   "id" serial NOT NULL PRIMARY KEY,

   "first_name" varchar(30) NOT NULL,

"last_name" varchar(30) NOT NULL);

 

class Meta:

   db_table = 'tb_person'#数据库中创建的表名称即为 tb_person

verbose_name = '用户表'#表名称 #在admin站点中显示的名称

verbose_name_plural = verbose_name#显示的复数名称

 

 

2、自动为数据库增加 id 自增主键列。因为,默认的,Django为每个模块设置一个field:

id = models.AutoField(primary_key=True)

如果想自己指定一个自定义的主键列,则必须按上述设置,显示指定字段名称。总之,不管是默认设置还是显示设置,必须有一个自增主键列。

参考链接:

https://docs.djangoproject.com/en/1.11/topics/db/models/#automatic-primary-key-fields

 

 

 

class Book(models.Model):

   book_name = models.CharField(max_length=30)

   borrower = models.ForeignKey(Person, to_field='id', on_delete=models.CASCADE)

 

说明:mysql中,生成的外键列名称,会自动命名为:field_id,如上borrower field对应的mysql列为borrower_id

 

class Musician(models.Model):

   auto_id = models.IntegerField(primary_key=True)

   first_name = models.CharField(max_length=50)

   last_name = models.CharField(max_length=50)

   instrument = models.CharField(max_length=100)

   last_update = models.DateField(auto_now=True, auto_now_add=True)

 

class Album(models.Model):

   artist = models.ForeignKey(Musician, to_field='auto_id', on_delete=models.PROTECT)

   name = models.CharField(max_length=100)

   release_date = models.DateField()

   num_stars = models.IntegerField()

 

 

Field 类型

 

AutoField

IntegerField,根据可获取的ID列值,自增

 

参数:verbose_name,个人推断,所有Field类型应该都有该参数,用于设置字段名称

 

BigAutoField

64位整型,类似AutoField,不同之处在于它可接收更大范围的数值:1 到9223372036854775807.

Django 1.10新增。

 

BigIntegerField

64位整型,类似IntegerField。不同之处在于它可接纳更大范围的数值:-9223372036854775808 到9223372036854775807。该field对应的默认组建:TextInput

 

BinaryField

用于存储原始二进制数据,仅支持字节。

 

BooleanField

true/false field.该field对应的默认表单组件:CheckboxInput。

如果需要接收null值,则使用NullBooleanField替代BooleanField。

如果未定义Field.default,那么BooleanField field默认值为None。

 

CharField

字符串类型。用于存储一定范围大小的字符串。针对大量文本,使用TextField。该field的默认组建为:TextInput

CharField有个额外的必填参数。CharField.max_length。设置可接纳的最大字符数。

 

DateField

日期类型。代表Python datetime.date实例。

class DateField(auto_now=False, auto_now_add=False, **options)[source]

可选参数:

DateField.auto_now

每次存储对象(仅针对调用save方法)时,自动设置该field的值为当前日期

 

注意:实践发现,调用Module_name.objects.Create()方法创建对象,auto_now()也起作用

 

DateField.auto_now_add

第一次创建对象时,自动设置field值为当前日期,所以,即便显示为该字段提供了值,也会自动忽视显示设定的值。

对于DateField:default=date.today - datetime.date.today()

对于DateTimeField: default=timezone.now - django.utils.timezone.now()

 

该field对应的默认表单组件为:TextInput。

 

注意:auto_now_add和auto_now两个参数不能同时使用。

 

 

TimeField

以python datetime.time实例表示的时间

 

可选参数:

DateField.auto_now

每次存储对象(仅针对调用save方法)时,自动设置该field的值为当前日期

 

DateField.auto_now_add

第一次创建对象时,自动设置field值为当前日期,所以,即便显示为该字段提供了值,也会自动忽视显示设定的值。

对于DateField:default=date.today - datetime.date.today()

对于DateTimeField: default=timezone.now - django.utils.timezone.now()

 

该field对应的默认表单组件为:TextInput。

 

 

DateTimeField

以python datetime.datetime实例表示的日期时间。

可选参数:

DateField.auto_now

每次存储对象(仅针对调用save方法)时,自动设置该field的值为当前日期时间

 

DateField.auto_now_add

第一次创建对象时,自动设置field值为当前日期时间,所以,即便显示为该字段提供了值,也会自动忽视显示

该field对应的默认表单组件为:TextInput。

 

DateTimeField字段的值,如果要保存为当前时间,可以通过timezone.now()快速获取当前时间进行赋值

>>> from django.utils import timezone

>>> update_time = timezone.now()

>>>user = User(username='test1', password='passwd123', email='email@163.com', update_time=update_time)

>>> user.save()

 

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
SQL Java 数据库
Django学习三:views业务层中通过models对实体对象进行的增、删、改、查操作。
这篇文章是关于如何使用Django框架的ORM系统在视图(views)层面进行数据库的增、删、改、查操作的教程。
20 0
Django学习三:views业务层中通过models对实体对象进行的增、删、改、查操作。
|
1月前
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
65 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
|
1月前
|
SQL Go 数据库
【速存】深入理解Django ORM:编写高效的数据库查询
【速存】深入理解Django ORM:编写高效的数据库查询
59 0
|
2月前
|
数据库 Python
django中数据库外键可以自定义名称吗
django中数据库外键可以自定义名称吗
|
3月前
|
API 数据库 开发者
【独家揭秘】Django ORM高手秘籍:如何玩转数据模型与数据库交互的艺术?
【8月更文挑战第31天】本文通过具体示例详细介绍了Django ORM的使用方法,包括数据模型设计与数据库操作的最佳实践。从创建应用和定义模型开始,逐步演示了查询、创建、更新和删除数据的全过程,并展示了关联查询与过滤的技巧,帮助开发者更高效地利用Django ORM构建和维护Web应用。通过这些基础概念和实践技巧,读者可以更好地掌握Django ORM,提升开发效率。
42 0
|
3月前
|
关系型数据库 MySQL 机器人
Django入门到放弃之数据库配置
Django入门到放弃之数据库配置
|
3月前
|
SQL Shell API
python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API
python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API
|
3月前
|
存储 缓存 关系型数据库
Django后端架构开发:缓存机制,接口缓存、文件缓存、数据库缓存与Memcached缓存
Django后端架构开发:缓存机制,接口缓存、文件缓存、数据库缓存与Memcached缓存
70 0
|
3月前
|
SQL 数据库 Windows
【应用服务 App Service】当使用EntityFrameWorkCore访问Sql Server数据库时,在Azure App Service会出现Cannot create a DbSet for ** because this type is not included in the model for the context的错误
【应用服务 App Service】当使用EntityFrameWorkCore访问Sql Server数据库时,在Azure App Service会出现Cannot create a DbSet for ** because this type is not included in the model for the context的错误
|
3月前
|
SQL 数据库
无法获得数据库 'model' 上的排他锁。请稍后重试该操作
无法获得数据库 'model' 上的排他锁。请稍后重试该操作
83 0