Django model 层之Models与Mysql数据库小结
测试环境:
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, PASSWORD,HOST, 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()