models 数据库操作

Django 对数据库的操作比较简单, 它已经对数据库进行了封闭, 我们无需去关注数据库的细节(即无需像三层架构那样对数据库进行封闭, Django 已经为我们封装好了).

首先, 打开工作目录下的 settings.py 文件, 修改 DATABASES:

DATABASES = {
    'default': {
        'ENGINE':'django.db.backends.mysql',
        'NAME':'newdjango',
        'USER':'root',
        'PASSWORD':'admin',
        'HOST':'',
        'PORT':'3306',
    }
}

上面的 NAME 指的是数据库名, 如下图:

接下来, 检查下 settings.py 里的 INSTALLED_APPS 是否包含 app:

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'web',
)

这里是最后一个 'web'.

Django 不能自动为我们创建数据库, 但是可以为自动创建表, 现在在 models.py 中设置表和字段.

#-*- coding:utf-8 -*-
from django.db import models

# Create your models here.
class UserInfo(models.Model): # 表名
    username = models.CharField(max_length=50) # 指定字段
    password = models.CharField(max_length=50) # 指定字段

然后, 依次执行命令:

python manage.py makemigrations -- 基于当前的 Model 创建新的策略文件

python manage.py migrate -- 让我们在修改 Model 后可以在不影响现有数据的前提下重建表结构

python manage.py syncdb -- migrate 已具有 syncdb 的功能, 所以无需再执行

Python 1.7 以下的版本执行 syncdb.

如果报错: No module named MySQLdb 那么就是没有安装 MySQL Python 模块, 安装下即可, 用 pip 似乎有点问题, 可以下载http://yunpan.cn/cm69fkFPDirFu 访问密码 2f0c 安装即可.

常用字段

models.AutoField

`自增列 ```如果没有的话, 默认会生成一个名称为 ``id` `的列, 如果要显示的自定义一个自增列, 必须将给列设置为主键 primary_key``=``True.``

models.CharField

字符串字段 必须指定 max_length 参数.

models.BooleanField

`布尔类型`` `不能为空, Blank``=``True.``

models.ComaSeparatedIntegerField

用逗号分割的数字 继承 CharField, 所以必须指定 max_lenght 参数.

models.DateField

日期类型 date `对于参数, auto_now ``=` `True` `则每次更新都会更新这个时间; auto_now_add 则只是第一次创建添加, 之后的更新不再改变.`

models.DateTimeField

日期类型 datetime 同DateField的参数.

models.Decimal

十进制小数类型 必须指定整数位 max_digits 和小数位 decimal_places.

models.EmailField

字符串类型 对字符串进行正则表达式.

models.FloatField

`浮点类型 ``double`

models.IntegerField

整形

models.BigIntegerField

长整形

models.SmallIntegerField

数字 `数据库中的字段有: tinyint、smallint、``int``、bigint`

models.PositiveIntegerFiel

正 Integer

models.PositiveSmallIntegerField

正 SmallInteger `integer_field_ranges ``=` `{` ```'IntegerField'``: (``-``2147483648``, ``2147483647``),` ```'BigIntegerField'``: (``-``9223372036854775808``, ``9223372036854775807``),` ```'PositiveSmallIntegerField'``: (``0``, ``32767``),` ```'PositiveIntegerField'``: (``0``, ``2147483647``),` `'SmallIntegerField'``: (``-``32768``, ``32767``),` `}`

models.IPAddressField

字符串类型(ip4正则表达式)

models.GenericIPAddressField

字符串类型(ip4和ip6是可选的) `参数 protocol 可以是: both、ipv4、ipv6` `验证时, 会根据设置报错`

models.NullBooleanField

允许为空的布尔类型

models.SlugField

减号、下划线、字母、数字

models.TextField

`字符串`` ``longtext`

models.TimeField

时间 HH:MM[:ss[.uuuuuu]]

models.URLField

字符串, 地址正则表达式

models.BinaryField

`二进制 ``23``、models.ImageField 图片 ``24``、models.FilePathField 文件`

常用参数

null = True

数据库中字段是否可以为空

blank = True

django 的 Admin 中添加数据时是否可允许空值

primary_key = False

主键,对AutoField设置主键后,就会代替原来的自增 id 列

auto_now

自动创建---无论添加或修改,都是当前操作的时间

auto_now_add

自动创建---永远是创建时的时间

choices

GENDER_CHOICE = ( (u'M', u'Male'), (u'F', u'Female'), ) gender = models.CharField(max_length=2,choices = GENDER_CHOICE)

max_length

default

默认值

verbose_name

Admin 中字段的显示名称

name|db_column

数据库中的字段名称

unique = True

不允许重复

db_index = True

数据库索引

editable = True

在 Admin 里是否可编辑

error_messages = None

错误提示

auto_created = False

自动创建

help_text

在 Admin 中提示帮助信息

validators = []

upload-to

外键 -- 多对一

用来形成表表对应, 即让一张表里的某些字段和另一张表里的 ID 字段形成联系.

#-*- coding:utf-8 -*-
from django.db import models

class UserType(models.Model): # 表名
    name = models.CharField(max_length=50) # 字段

# Create your models here.
class UserInfo(models.Model): # 表名
    username = models.CharField(max_length=50) # 字段
    password = models.CharField(max_length=50) # 字段
    '''
    建立外键
    字段名称+ "_id" 做为数据库中的列名称
    这里最终数据库中就是 typeId_id
    '''
    typeId = models.ForeignKey("UserType")

外键 -- 多对多

要实现多对多, 需要再创建一个"中间表", 使用 Django, 它会自动帮我们创建.

class User(models.Model): # 表名
    account = models.CharField(max_length=50) # 字段

class Group(models.Model): # 表名
    groupName = models.CharField(max_length=50) # 字段
    user_relation = models.ManyToManyField("User") # 建立关系, Django 会自动建立中间表

Last updated