【Django 007】数据模型models数据库交互详解

企业开发中,通常都是从数据定义开始一个项目,所以我们也从models开始深入了解一下。

我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。

环境搭建

离开之前的HelloDjango项目,新建一个DjangoModel项目。

步骤和之前是一样的,这里就不详细演示每一步的操作了:

  1. virtualenv创建虚拟环境,这里可以直接用之前的虚拟环境。记得activate环境
  2. django-admin startproject DjangoModel新建项目
  3. pycharm打开项目,注意是在manage.py的上一级打开
  4. 配置解释器为虚拟环境内的python,前一个项目的第三方包都会自动识别
  5. python manage.py startapp App新建一个应用,并在settings中注册
  6. mysql创好数据库DjangoModel,每次都用新的库,不然会有问题
  7. 修改配置文件settings.py,包括数据库连接信息,全局templates文件路径等等
  8. 全局__init__.py中对pymysql进行伪装pymysql.install_as_MySQLdb()
  9. 默认数据迁移python manage.py migrate

ORM

ORM(Object Relational Mapping),对象关系映射,可以简单理解为一个翻译机。其将面向对象的操作翻译为后端的SQL语句,达到业务逻辑和数据操作的解耦合。

如果直接对数据库进行操作,会涉及到SQL语句中的insertselect等等操作,而且不同类型的数据库可能SQL的语法还不太一样。ORM相当于提供了一个统一的接口,不管后端是什么数据库,在面向对象中调用提供的接口,ORM会自动翻译成后端可用的SQL语句。

具体的细节不需要关系,只需要会使用即可。

数据类型的映射

在Django的models.py中定义的一个继承自models.Model的class就对应着数据库中的一个table,而这个class中的属性就对应着数据库中的字段(field)。class和table对应还很好理解,就是定义一个名字,但是class的属性和字段的对应就有可能有矛盾了。

数据库中的数据类型总结起来就三种:数字,字符和时间。

但是Django从用户接受的数据却不仅仅局限于这三种,用户有可能上传文件或者图片,又或者利用前端的textarea传递来一长串的内容。

为了解决这种不对称性,Django的models为我们提供了很多数据类型来选择,这些不同的数据类型对应着内存中不同的存储方式

Models中的数据类型

这些数据类型定义在django.db.models.fields中。

  • AutoField
    一个根据ID自动增长的IntegerField,通常不用自己定义。不定义的话,一个主键字段会被自动添加到models中
  • CharField(max_length=xx)
    字符串,默认的前端表单样式是InputText
  • TextField
    大文本字段,默认的前端表单样式是TextArea
  • IntegerField
    整型
  • DecimalField
    更精确的十进制浮点数,python的Decimal实例表示
  • FloatField
    浮点型
  • BooleanField
    布尔类型
  • NullBooleanField
    支持Null,True,False三种类型
  • DateField/TimeField/DateTimeField
    和时间相关的数据类型
  • FileField
    上传文件的字段。直接存文件会造成数据库非常臃肿,这里存的是文件的存储路径
  • ImageField
    继承自FileField,不过多加了一步校验,确保是image

约束条件

上面的这些数据类型都是继承自django.db.models.fields.field类,我们来看看这个类的构建方法

def __init__(self, verbose_name=None, name=None, primary_key=False,
                 max_length=None, unique=False, blank=False, null=False,
                 db_index=False, rel=None, default=NOT_PROVIDED, editable=True,
                 serialize=True, unique_for_date=None, unique_for_month=None,
                 unique_for_year=None, choices=None, help_text='', db_column=None,
                 db_tablespace=None, auto_created=False, validators=(),
                 error_messages=None):

可以看到在定义的时候还可以加入一些限制条件,这些其实和SQL中的限制条件类似

  • null
    默认是False,如果是True,Django会将空值以null存储到数据库中
  • blank
    默认是False,如果是True,该字段允许为空白。注意区分null和blank的区别,null是数据库范畴的概念
  • db_column
    指定字段在数据库中存储的名字,如果不指定,以类属性代替
  • db_index
    给字段加索引,加索引要谨慎
  • default
    默认值
  • primary_key
    主键
  • unique
    唯一性约束

元选项

在models的类中再定义一个类,用于设置元数据

class meta:
    db_table = xxx  # 定义table的名字
    ording = []  # 根据某些字段来排序

实际操作(数据类型映射)

App/models.py中创建一个model,如下

from django.db import models

# Create your models here.
class Person(models.Model):
    name = models.CharField(max_length=16, unique=True)
    age = models.IntegerField(default=18)
    sex = models.BooleanField(default=False)  # False is female, True is male

    class Meta:
        db_table = 'People'

相当于在数据库中创建一个表,表的名字由原先的App_person改为People。同时定义了3个字段,对应着三种不同的Django数据类型,同时还加了一些约束。

然后生成迁移文件并执行迁移,如下:

(django) [fuh
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值