建立新项目
建立项目DJ
建立新应用App
切换mysql
setting注册
伪装pymsql
迁移文件
设置时区
set global time_zone='+8:00';
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连续使用
- 链式调用,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
查数据
添加路由
url('getpersons/',views.get_persons),
添加view函数
def get_persons(request):
#__gt大于,__lt小于
#筛选出大于18小于80的人的姓名和年龄
# persons = Person.objects.filter(p_age__gt=18).filter(p_age__lt=80)
#筛选出大于等于50的,及排除小于50的,并且小于80的
persons = Person.objects.exclude(p_age__lt=50).filter(p_age__lt=80)
#填坑
context = {
'persons':persons
}
return render(request,'person_list.html',context=context)
html文件person_list
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>personList</title>
</head>
<body>
<h3>personlist</h3>
<ul>
{% for person in persons %}
<li>姓名:{{ person.p_name }}年龄:{{ person.p_age }}</li>
{% endfor %}
</ul>
</body>
</html>
查看结果
这里只展示一种结果
views代码里的persons是一个查询结果集:django.db.models.query.QuerySet
创建对象
目的:
向数据库中添加数据
当创建对象时,django不会对数据库进行读写操作,当调用save()方法时才与数据库交互,将对象保存到数据库中
注意: __init__已经在父类models.Model中使用,在自定义的模型中无法使用
创建对象方案:
views:
def add_person(request):
person = Person.objects.create(p_name='张三', p_age=15, p_sex=True)
person.save()
return HttpResponse('创建成功')
url:
url('addperson', views.add_person),
结果:
假如我们现在再插入一个列比如p_hobby列,我们需要重新迁移
在模型类中增加类方法去创建对象
@classmethod
def create(cls,name,age):
在自定义的管理器中添加方法来创建对象
方法:
- 对象方法
可以调用对象的属性,也可以调用类的属性
- 类方法
- 不能调用对象属性,只能调用类属性
- 静态方法
- 啥都不能调用,不能获取对象属性,也不能获取类属性
- 只是寄生在我们这个类上而已
不同于之前的:
1:
person = Person()
flag = random.randrange(100)
person.p_name = 'tom%d' % i
person.p_age = flag
person.p_sex = flag % 2
person.save()
和2:
person = Person.objects.create(p_name='张三', p_age=15, p_sex=True)
person.save()
这次操作方法是创建类方法去创建对象
我们在models中添加类方法
@classmethod
def create(cls, p_name, p_age=100, p_sex=True, p_hobby='gaming'):
return cls(p_name=p_name, p_age=p_age, p_sex=p_sex, p_hobby=p_hobby)
然后我们在views中调用我们的类方法去创建对象
def add_person(request):
# person = Person.objects.create(p_name='张三', p_age=15, p_sex=True)
person = Person.create('jack')
person.save()
此处评论已关闭