Django模块学习[4] Model介绍,ORM,字段类型,约束1
建立新项目
建立项目DJ
建立新应用App
记得注册
切换mysql
setting注册
伪装pymsql
迁移文件
结果如下
MODEL(模型)
企业开发中,通常是从数据开始开发的,不像之前直接从路由学起。
Django对各种数据库都提供了很好的支持,对不同的数据库,Django提供了统一调用的API,我们可以根据不同的业务需求使用不同的数据库。
- 配置数据库:pip install pymysql
- 在工程目录下的__init__.py中输入
import pymysql
pymysql.install_as_MySQLdb()
- 完成数据库驱动加载
SETTINGS.PY
'ENGINE':'django.db.backends.mysql'
'NAME':'数据库名'
'USER':'root'
'PASSWORD':'密码'
'HOST':'LOCALHOST',#连远端需要修改
'PORT':'3306',
开发流程
1.配置数据库
2.定义模型类(一个模型类对应一个数据库表,一个字段是一列)
3.生成迁移文件
4.执行迁移生成数据表
5.使用模型类进行增删改查操作
ORM
ORM(OBJECT RELATIONAL MAPPING)对象关系映射,是一种程序技术,用于实现面向对象编程语言里不用类型系统的数据之间的转换,可以简单理解为翻译机。
核心特点是:解耦合 将业务逻辑和sql解耦(sql本身也是编程语言)
Django模型定义
重要概念:模型,表,属性,字段
一个模型映射一张表,一个属性映射表中的列
定义属性(坑)
见定义属性文件
数据库中数据类型:
- 字符串
- 数字
- 时间
数据类型影响的是内存分配:例如布尔值1bit,一个字符串32bit
null 和 blank区别:null代表NONE表示什么都没有,而BLANK表示''即引号内为空
索引应用在:
- 建立在外键上,滥用索引反而会降低查询速度
- 经常查询的字段上
unique用在唯一约束,例如电话号码,用户名这种不允许约束的情况上
创建模型类
元信息
俗名类中类,通过类设置子类,再设置属性
元选项,再模型类中定义Meta,用于设置元信息:
class Meta:
db_table = xxx #定于数据表名,推荐使用小写字母
ordering=[]
对象的默认排序字段,获取对象列表时使用,通常是Integer类形,升序ordering['id'],降序ordering['-id']
在App.models中设置模型:
from django.db import models
# Create your models here.
class Person(models.Model):
p_name=models.CharField(max_length=16,unique=True)#用户名不允许重复,所以使用约束unique
p_age = models.IntegerField(default=18,db_column='age')
#False为男,True为女,db_clomn是设置映射后的数据库列名,默认列名为前面的属性名p_sex
p_sex = models.NullBooleanField(default=False,db_column='sex')
#修改表名,如果不设置Meta原表名为App_Person
class Meta:
db_table = 'People'
然后迁移数据makemigrations,注意:必须要提前注册App至settings.py中
查看表:
表名,列名都修改完成
但是default约束是放在操作中完成的,并没有放在建表语句中
模型成员objexts
Django默认通过模型的objexts对象实现模型数据查询
all()所有,get(条件)指定一个(不常用,因为我们通常查询数据需要筛选条件)
Django有两种过滤器用于筛选记录
- filter:返回符合筛选条件的数据集
- exclede:返回不符合筛选条件的数据集
多个filter和exclude可以连接在一起查询
模型过滤
filter,exclude连续使用
- 链式调用,ruperson.objects.filter().filter().xxx.exclude().yyyy
为了实践我们用代码添加一些数据进去
首先添加一个App子路由,记得先注册:
总路由:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('App',include('App.urls')),
]
app子路由:
from django.conf.urls import url
from App import views
urlpatterns=[
url('addpersons/',views.add_persons),
]
views:
from App.models import Person
import random
def add_persons(request):
for i in range(15):
person = Person()
flag = random.randrange(100)
person.p_name = 'tom%d' % flag
person.p_age = flag
person.p_sex = flag % 2
person.save()
return HttpResponse('批量创建成功')
运行访问:
报错原因是随机到了名字重复,因为之前约束了unique
将views中第8行改为
person.p_name = 'tom%d' % i
修改完之后成功