环境准备
- 创建一个新项目
django-admin startproject djangomodel
django-admin startapp App
python manage.py startapp App
- 创建templates并标记
- settings.py
ALLOWED_HOSTS = ['*']
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'App',
]
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
os.path.join(BASE_DIR,'templates')
],
DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'ENGINE': 'django.db.backends.mysql',
'NAME': 'GP1djangomodel',
'PORT':'3306',
'HOST':'localhost',
'USER':'root',
'PASSWORD':'mysql',
}
}
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
- __init__.py
import pymysql
pymysql.install_as_MySQLdb()
- mysql创建库
mysql> create database GP1djangomodel charset=utf8;
Query OK, 1 row affected (0.17 sec)
- 迁移数据库
python manage.py startapp App
今日内容
model
- 在企业开发中,我们通常是从数据开始开发的
开发流程
- 配置数据库
- 定义模型类(一个模型类对应数据库中的一张表)
- 生成迁移文件
- 执行迁移生成数据表
- 使用模型类进行增删改查(CRUD)操作
ORM
ORM(object relational mapping)对象关系映射,是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间(数据与数据库之间)的转换,可以简单理解为翻译机,核心思想是解耦,将业务逻辑与数据库的SQL语句进行解耦
graph LR
实体-->ORM
ORM-->数据库
graph LR
model-->ORM
ORM-->database
- 对象关系映射
- 理解为翻译机
- 核心思想,解耦合
- 将业务逻辑和SQL进行了解耦
Django定义模型
- 重要概念:表,属性,字段
- 一个模型在数据库中对应一张表,在模型类中定义的属性,对应该模型对照表中的一个字段
- 定义属性见定义属性文件
- 创建模型类
- 元选项,在模型中定义Meta,用于设置元信息(类中类)
class Meta:
db_table=xxx #定义数据表名,推荐使用小写字母
ordering = []
#对象的默认排序字段,获取对象列表时使用,通常是integer类型,升序ordering['id'],降序ordering['-id']
数据库中数据类型
- 字符串
- 数字
- 日期时间
- models.py
from django.db import models
# Create your models here.
#伪装Django模型
class Person(models.Model):
# 约束,用户名不允许重复
p_name = models.CharField(max_length=16,unique=True)
# 默认18岁
p_age = models.IntegerField(default=18,db_column='age')
# False 代表男,True代表女,db_column映射
p_sex = models.BooleanField(default=False,db_column='sex')
#改表名
class Meta:
db_table = 'People'
E:py27Django_projectdjangomodel>python manage.py makemigrations
Migrations for 'App':
Appmigrations 001_initial.py
- Create model Person
E:py27Django_projectdjangomodel>python manage.py migrate
Operations to perform:
Apply all migrations: App, admin, auth, contenttypes, sessions
Running migrations:
Applying App.0001_initial... OK
模型成员objects
Django默认通过模型的objects对象实现模型数据查询
Django有两种过滤器用于筛选记录
- filter : 返回符合筛选条件的数据集
- exclude : 返回不符合筛选条件的数据集
多个filter和exclude可以连接在一起查询
模型过滤
* filter
* exclude
* 连续使用
* 链式调用
* Persion.objects.filter(条件).filter(条件).xxx.exclude().exclude()
创建model
- djangomodel/urls.py
from django.contrib import admin
from django.conf.urls import url,include
urlpatterns = [
url('admin/', admin.site.urls),
url('^App/',include('App.urls')),
]
添加用户
- App/urls.py
#conding:utf-8
from django.conf.urls import url
from App import views
urlpatterns = [
url(r'^addpersions/',views.add_persions),
]
- App/views.py
from django.shortcuts import render,HttpResponse
from App.models import Person
import random
# Create your views here.
def add_persions(request):
for i in range(15):
persion = Person()
flag = random.randrange(100)
persion.p_name = 'Tom%d' %i
persion.p_age = flag
persion.p_sex = flag%2
persion.save()
return HttpResponse("批量创建成功")
查询用户
#conding:utf-8
from django.conf.urls import url
from App import views
urlpatterns = [
url(r'^addpersions/',views.add_persions),
url(r'getpersions/',views.get_persions),
]
- 过滤条件1 filter(将满足条件的拿出来)
def get_persions(request):
persion = Person.objects.filter(p_age__gt=18)
context = {
"persion":persion
}
return render(request,'persion_list.html',context=context)
- 过滤条件2
def get_persions(request):
persion = Person.objects.filter(p_age__gt=50)
context = {
"persion":persion
}
return render(request,'persion_list.html',context=context)
- 过滤条件3(级联调用)
def get_persions(request):
persion = Person.objects.filter(p_age__gt=50).filter(p_age__lt = 80)
context = {
"persion":persion
}
return render(request,'persion_list.html',context=context)
- 过滤条件4 exclude(将满足条件的踢走)
def get_persions(request):
# persion = Person.objects.filter(p_age__gt=50).filter(p_age__lt = 80)
persion = Person.objects.exclude(p_age__lt=50)
context = {
"persion":persion
}
return render(request,'persion_list.html',context=context)
- 过滤条件5
def get_persions(request):
# persion = Person.objects.filter(p_age__gt=50).filter(p_age__lt = 80)
persion = Person.objects.exclude(p_age__lt=50).filter(p_age__lt=80)
context = {
"persion":persion
}
return render(request,'persion_list.html',context=context)
- persion类型,是查询结果集
def get_persions(request):
# persion = Person.objects.filter(p_age__gt=50).filter(p_age__lt = 80)
persion = Person.objects.exclude(p_age__lt=50).filter(p_age__lt=80)
print(type(persion))
context = {
"persion":persion
}
return render(request,'persion_list.html',context=context)
System check identified no issues (0 silenced).
November 28, 2019 - 11:37:41
Django version 1.11.26, using settings 'djangomodel.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
<class 'django.db.models.query.QuerySet'> #不是列表,但是可迭代
[28/Nov/2019 11:37:41] "GET /App/getpersions/ HTTP/1.1" 200 478
<class 'django.db.models.query.QuerySet'>
[28/Nov/2019 11:37:43] "GET /App/getpersions/ HTTP/1.1" 200 478
- 过滤条件 6
def get_persions(request):
# persion = Person.objects.filter(p_age__gt=50).filter(p_age__lt = 80)
persion = Person.objects.exclude(p_age__lt=50).filter(p_age__gt=80)
print(type(persion))
persiontwo = Person.objects.filter(p_age__in=[40,30,47])
print(type(persiontwo))
context = {
"persion":persion,
"persiontwo":persiontwo
}
return render(request,'persion_list.html',context=context)
- templates/persion_list.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>persion_list</title>
</head>
<body>
<h3>PersionList</h3>
<ul>
{% for persion in persion %}
<li>姓名:{{ persion.p_name }} 年龄:{{ persion.p_age }}</li>
{% endfor %}
</ul>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>persion_list</title>
</head>
<body>
<h3>PersionList</h3>
<ul>
{% for persion in persion %}
<li>姓名:{{ persion.p_name }} 年龄:{{ persion.p_age }}</li>
{% endfor %}
</ul>
<ul>
{% for persiontwo in persiontwo %}
<li>姓名2:{{ persiontwo.p_name }} 年龄2:{{ persiontwo.p_age }}</li>
{% endfor %}
</ul>
</body>
</html>
创建对象
通过方法创建对象,然后传递属性,属性可以指定默认值
目的:向数据库中添加数据
当创建对象时,Django不会对数据库进行读写操作,当调用save()方法时才与数据库交互,将对象保存到数据库中
注意:__init__已经在父类models.Model中使用,在自定义的模型中无法使用
创建对象方案:
在模型类中增加类方法去创建对象
@classmethod
def create(cls,name,age):
在自定义的管理器中添加方法来创建对象
#conding:utf-8
from django.conf.urls import url
from App import views
urlpatterns = [
url(r'^addpersions/',views.add_persions),
url(r'getpersions/',views.get_persions),
url(r'^addperson',views.add_person),
]
- 要求写的字段都必须写
def add_person(request):
person = Person.objects.create(p_name = '小明',p_age = 15,p_sex=True)
person.save()
return HttpResponse('小明创建成功')
方法
- 对象方法
- 可以调用对象的属性,也可以调用类的属性
- 类方法
- 不能调用对象属性,只能调用类属性
- 静态方法
- 啥都不能调用,不能获取对象属性,也不能获取类熟悉
- 只是寄生在我们这个类上而已
from django.db import models
# Create your models here.
#伪装Django模型
class Person(models.Model):
# 约束,用户名不允许重复
p_name = models.CharField(max_length=16,unique=True)
# 默认18岁
p_age = models.IntegerField(default=18,db_column='age')
# False 代表男,True代表女,db_column映射
p_sex = models.BooleanField(default=False,db_column='sex')
# 加属性
p_hobby = models.CharField(max_length=32,null=True,blank=True)
#改表名
@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_hobby=p_hobby)
class Meta:
db_table = 'People'
def add_person(request):
# person = Person.objects.create(p_name = '小明',p_age = 15,p_sex=True)
# person.save()
# person = Person(p_age=28)
# 是"" None Null 不能重写__init__ 可以通过其他手段,实现属性自定义赋值
person = Person.create('jack')
person.save()
return HttpResponse('创建成功')