1.数据库模型

Django  ORM 操作数据库


我们知道Django处理一个HTTP完整的请求和响应流程中,要想响应动态的数据给HTTP的客户端,就必须解决怎么从数据库中处理数据。

Django 使用了一种新的方式,关系对象映射(Object Relational Mapping,简称ORM),其他语言其实也有自己的ORM

  PHP:activerecord

  Java:Hibernate 

     C#  :Entity Framework

django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表。

模型配置:

  • 1.创建users app

tools》run manage.py task >>控制台:manage.py@DjangoStart > startapp users

  • 2.编写users的models

a.继承Django默认提供的user表:from django.contrib.auth.models import AbstractUser
b.编写自己的user表

 1 # -*- coding: utf-8 -*-
 2 from __future__ import unicode_literals
 3 
 4 # 导入默认提供的user表
 5 from django.contrib.auth.models import AbstractUser
 6 from django.db import models
 7 
 8 # Create your models here.
 9 # 继承AbstractUser默认user表
10 class UserProfile(AbstractUser):
11     nick_name = models.CharField(max_length=50,verbose_name=u'昵称',default=u"")
12     # null = True:表示空值将会被存储为NULL
13     #  blank = True:表示在页面当中对应的表单可以为空,可以不填任何内容
14     birday = models.DateField(verbose_name=u'生日',null=True)
15     gender = models.CharField(max_length=50,choices=(('male',u''),('female','')),default='male')
16     address = models.CharField(max_length=100,default=u"")
17     mobile = models.CharField(max_length=11,null = True,blank=True)
18     image = models.ImageField(upload_to='image/%Y/%m',default=u"image/default.png",max_length=100) # 因为图片在后台是以字符串形式存放,所以要长度
19 
20     class Meta:
21         verbose_name = "用户信息"
22         verbose_name_plural = verbose_name  # 复数形式
23 
24     def __unicode__(self):
25         return self.username
models

 

  • 3.添加users app 到settings中,同时重载AUTH_USER_MODEL = "users.UserProfile",django允许,通过设置AUTH_USER_MODEL值来重定义默认用户模型s
  • 4.makemigrations users 创建数据库生成的中间文件,migrate users 创建实际数据表

在你改动了 model.py的内容之后执行下面的命令:

      Python manger.py makemigrations

    相当于 在该app下建立 migrations目录,并记录下你所有的关于modes.py的改动,比如0001_initial.py, 但是这个改动还没有作用到数据库文件


    在此之后执行命令

      python manager.py migrate

    将该改动作用到数据库文件,比如产生table之类


参考:


 

ORM 是如何映射的

Django 规定在 models.py 文件内 创建一个类,然后进行初始化、迁移后,Django就会根据这个类在数据库中创建相应的表以及表的字段内容。

其对应关系如下:

类名                     ------>     数据库中的表名

类属性                  ------>     表字段

每一个实例化的对象 ------>     表中的每一天数据

 

在 models.py 文件中,每一个模型类都会被映射为一张数据库中的表,除此之外字段的数据类型,表的主键、外键、约束等也通过类的属性来定义。而且,数据类型及其最大长度是必须指明的。

 

示例:

 
1
2
3
4
5
6
7
class  Students (models.model):
    sid      = models.AutoField(primary_key=True) # 当设置为主键时,就会自动被赋予自增、唯一等属性
    name     = models.CharField(max_length=32)
    age      = models.IntegerField() # 数字不用指明长度
    gender   = models.CharField(max_length=6)
    classees = models.CharField(max_length=32)
    class Mata:
        db_table = Students

解析说明:

  •     所有的Django模型类都必须继承 django.db.models.Model 类。
  •    通过其中类属性定义模型字段,模型字段必须是某种 models.XXField 类型,需要指明长度的类型,最大长度也是需要指明的。
  •    通过模型类中的 Meta 子类定义模型元数据,比如数据库的表名、数据默认排序方式等。

Meta 类的属性名由 Django 预先定义,常用的 Meta 类属性汇总如下:

  •     absstract: True  of False,标识本类是否为抽象基类。
  •     app_label: 定义本类的所属的应用,比如 app_label = 'myapp'
  •     db_table:  映射的数据库的表名,假如不指定,则 Django 会自动创建,命名格式为:“应用名_模型类名”
  •     db_tablespace:  映射的表空间名称。某一些数据库存在表空间概念,如Oracle,不存在的忽略。
  •     default_related_name: 定义本模型的反向映射关系
  •     get_latest_by: 定义按哪个字段值排序
  •     managed: True or False  ,定义 Django 的manage.py 命令行工具是否管理本模型。默认为 True。False 是不会在数据库中生成表。
  •     order_with_respect_to: 定义本模型按照某外键引用的关系排序
  •     ordering: 本模型默认排序字段,可设置多个(见《Python 高效开发实战》191页)

 

Django 术语:"生成数据移植文件"  (makemigrations)

    是指将 models.py  中定义的数据表转换成数据库生成脚本的过程。改过程通过命令完成:

 
1
cd Myproject  # 先进入到 Django 目录
python3   manage.py   makemigrations   app

此命令执行成功后,会在应用 app 的 migrations 目录下创建 0001_initial.py 文件;这个文件是数据库生成的中间文件,通过它可以指定当前的数据库版本。

    在 makemigrations 的过程中,Django 会对比 models.py 中的模型与已有数据库之间的差异,如果没有差异则不做任何操作。

假如对 models.py 有任何改变,则在下次执行 makemigrations 的时候会同步更新到数据库。

posted @ 2017-07-22 23:41  yangyongbo  阅读(113)  评论(0)    收藏  举报