models -- 数据库表、字段及连表

Par @Martin dans le
Tags :

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 会自动建立中间表