Django框架之ORM框架基础教程

之前介绍了SQLAlchemy这个ORM的框架,不过既然学习Django的话,那么Django自带的ORM框架比就必须学习了。

python-django

0x00 ORM连接数据库

1.由于Django的ORM框架无法自动完成数据库的创建,因而第一步需要手动创建数据库,下文以MySQL为例。创建数据库的时候不要忘记charset=utf8,不然使用的时候会有点编码问题。

2.创建好数据库后,需要到Django项目中的配置文件setting.py中进行数据库信息的配置。

DATABASES = {
    'default': {
                'ENGINE': 'django.db.backends.mysql',  # 数据库类型
                'NAME': 'django0525',  # 数据库名字
                'HOST': '127.0.0.1',  # IP
                'PORT': 3306,  # 端口
                'USER': 'root',  # 用户名
                'PASSWORD': '',  # 密码
            }
}

3.由于Django中的执行数据库的插件为mysqldb,在Python 3.x中无法使用,需要替换为pymysql。

具体操作在项目的__init__.py文件中。

import pymysql

pymysql.install_as_MySQLdb()

4.在ORM框架中,类——表;对象——行;属性——字段。

django-orm

创建数据库表需要到app下的models.py中创建一个类,其需要继承models.Model。

接下来就开始创建数据库表了,以创建一个出版社信息表和书籍表为例。。

# filename:models.py
from django.db import models

# Create your models here.
class Publisher(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=12, unique=True)


class Book(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=64, unique=True)
    publiser = models.ForeignKey(to=Publisher)

5.向MySQL提交变更。

python manage.py makemigrations app01
python manage.py migragte app01

第一行命令主要是提交变更,第二行操作主要为将改动翻译为SQL语句。

django-orm-migrate

Ps.一般好像执行命令即可,但是后接app名称更好吧!!!

0x01 ORM框架中的表关系

表和表之间的关系,主要分为“一对多”和“多对多”的关系。

A 一对多

刚才的例子中,出版社和书籍之间的关系就是典型的一对多的关系,一个出版社可以出版多本图书。

from django.db import models

# Create your models here.
class Publisher(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=12, unique=True)


class Book(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=64, unique=True)
    # 一对多的关系可以使用ForeignKey来完成
    publiser = models.ForeignKey(to=Publisher)

这里需要注意的地方是,通过ORM框架创建的表格其命名方式为app+类名,具体看下图。其次就是通过外联创建出来的关系在数据表中的命名方式,具体也见下图。

django-orm-forignkey

B 多对多

作者和书籍的关系就是可以多对多。

from django.db import models

# Create your models here.
class Publisher(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=12, unique=True)


class Book(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=64, unique=True)
    # 一对多的关系可以使用ForeignKey来完成
    publiser = models.ForeignKey(to=Publisher)

class Author(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32,unique=True)
    # 使用ManyToMany来创建多对多的关系
    book = models.ManyToManyField('Book')

在Author中的book属性,指的是Book的一行,并非数目。使用ManyToMany后会自动创建一张关系表。

django-orm-manytomany

0x02 ORM框架的增删改查

ORM框架的增删改查基于面向对象的原理,不过注意的是在修改数据的时候,修改完毕后记得提交更新哦~下面以添加出版社为例来进行Django中的ORM框架的增删改查操作。

from django.shortcuts import render, HttpResponse
from django.views import View
from app01 import models


# Create your views here.
class Tester(View):
    def get(self, request):
        # 增加数据
        models.Publisher.objects.create(name='西安出版社')
        models.Publisher.objects.create(name='成都出版社')
        models.Publisher.objects.create(name='东莞出版社')
        models.Publisher.objects.create(name='广州出版社')

        # 查询数据(全部数据)
        p = models.Publisher.objects.all()
        for i in p:
            print(i.name)
        # 查询指定数据
        p1 = models.Publisher.objects.get(name = '西安出版社')
        print(p1.id)    # 1

        # 删除数据
        p1.delete()

        # 修改数据
        p2 = models.Publisher.objects.get(name = '东莞出版社')
        p2.name = '北京出版社'
        p2.save()

        return HttpResponse('OK!')

0x03 ORM框架中的字段及参数

A 常用字段

  • AutoField: int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。
  • IntegerField: 一个整数类型,范围在 -2147483648 to 2147483647。
  • CharField: 字符类型,必须提供max_length参数, max_length表示字符长度。
  • DateField: 日期字段,日期格式  YYYY-MM-DD,相当于Python中的datetime.date()实例。
  • DateTimeField: 日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例。

其余不常用字段如下:

AutoField(Field)
         - int自增列,必须填入参数 primary_key=True

BigAutoField(AutoField)
    - bigint自增列,必须填入参数 primary_key=True

    注:当model中如果没有自增列,则自动会创建一个列名为id的列
    from django.db import models

    class UserInfo(models.Model):
        # 自动创建一个列名为id的且为自增的整数列
        username = models.CharField(max_length=32)

    class Group(models.Model):
        # 自定义自增列
        nid = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32)

SmallIntegerField(IntegerField):
    - 小整数 -32768 ~ 32767

PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
    - 正小整数 0 ~ 32767
IntegerField(Field)
    - 整数列(有符号的) -2147483648 ~ 2147483647

PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
    - 正整数 0 ~ 2147483647

BigIntegerField(IntegerField):
    - 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807

BooleanField(Field)
    - 布尔值类型

NullBooleanField(Field):
    - 可以为空的布尔值

CharField(Field)
    - 字符类型
    - 必须提供max_length参数, max_length表示字符长度

TextField(Field)
    - 文本类型

EmailField(CharField):
    - 字符串类型,Django Admin以及ModelForm中提供验证机制

IPAddressField(Field)
    - 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制

GenericIPAddressField(Field)
    - 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6
    - 参数:
        protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
        unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启此功能,需要protocol="both"

URLField(CharField)
    - 字符串类型,Django Admin以及ModelForm中提供验证 URL

SlugField(CharField)
    - 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号)

CommaSeparatedIntegerField(CharField)
    - 字符串类型,格式必须为逗号分割的数字

UUIDField(Field)
    - 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证

FilePathField(Field)
    - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
    - 参数:
            path,                      文件夹路径
            match=None,                正则匹配
            recursive=False,           递归下面的文件夹
            allow_files=True,          允许文件
            allow_folders=False,       允许文件夹

FileField(Field)
    - 字符串,路径保存在数据库,文件上传到指定目录
    - 参数:
        upload_to = ""      上传文件的保存路径
        storage = None      存储组件,默认django.core.files.storage.FileSystemStorage

ImageField(FileField)
    - 字符串,路径保存在数据库,文件上传到指定目录
    - 参数:
        upload_to = ""      上传文件的保存路径
        storage = None      存储组件,默认django.core.files.storage.FileSystemStorage
        width_field=None,   上传图片的高度保存的数据库字段名(字符串)
        height_field=None   上传图片的宽度保存的数据库字段名(字符串)

DateTimeField(DateField)
    - 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]

DateField(DateTimeCheckMixin, Field)
    - 日期格式      YYYY-MM-DD

TimeField(DateTimeCheckMixin, Field)
    - 时间格式      HH:MM[:ss[.uuuuuu]]

DurationField(Field)
    - 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型

FloatField(Field)
    - 浮点型

DecimalField(Field)
    - 10进制小数
    - 参数:
        max_digits,小数总长度
        decimal_places,小数位长度

BinaryField(Field)
    - 二进制类型

B 常用参数

  • null:字段可以为空。
  • unqiue:设置为True后,则表示是唯一值。
  • db_index:设置为True后,则表示设置索引。
  • default:设置默认值。

其余2个属性为时间字段独有参数,可以使用于DatetimeField、DateField、TimeField字段中:

  • auto_now_add:设置为True后,创建数据行时候,添加当前时间到数据库中。
  • auto_now:设置为True后,每次更新数据时,则会更新改字段时间记录。

发表评论