- 众所周知,Django 采用了 MVT 的软件设计模式,即模型(Model),视图(View)和模板(Template)。
前面个两篇文章我们用一个简单的案例初步学习了django,但是只涉及到了视图(View)和模板(Template),这一篇我们说一下模型(Model)
模型(Model)
在我目前的理解来看,模型就是操作和数据库相关的,目前我知道的就是他是用来创建数据库的。封装数据的交互操作
- 每个模型都是一个Python类,它是
django.db.models.Model
的子类。
例如我们再models.py里创建一个类:
from django.db import models
class Student(models.Model):
s_name = models.CharField(max_length=16)
s_age = models.IntegerField(default=18)
在这个类里面继承了models.Model
类,然后我们定义两个列,分别是
s_name
定义为char类型,最大长度为16s_age
定义为int类型,默认值时18
然后我们使用:
python manage.py mirgrations
python manage.py mirgrate
来生成迁移文件(migrations/0001_initial.py
),并将迁移文件映射到库中.
这时我们可以连接sqlite查看是否有创建的东西:
当然我们也可以反向迁移
- 可以根据数据库中表⾃动创建模型
python manage.py inspectdb > App/models.py
这里生成的model中的元信息中包含一个属性manage=False
表示该模型不被迁移系统管理
ORM
这里我们说明一下什么是ORM
- ORM 全拼Object-Relation Mapping.
- 中文意为 对象-关系映射.
- 在Django中model是你数据的单一、明确的信息来源。它包含了你存储的数据的重要字段和行为。通常,一个模型(model)映射到一个数据库表.
就像上面我们创建一个表,并没有使用sql语句,而是使用ORM将python代码转换成sql语句并通过驱动传递到数据库执行的,下面这个图可以让我们一目了然:
接下来我们通过对数据库的增删改查来了解ORM是如何写的:
对数据的增删改查
首先我们再urls.py里设置路由:
from django.urls import path
from yuaneuro import views
urlpatterns = [
path('', views.hello), # hello
path('stu/', views.stu), # 增
path('get_stu/', views.get_stu), # 查
path('update_stu/', views.update_stu), # 改
path('del_stu/', views.del_stu), # 删
]
四个路由分别对应增删改查
然后我们再views.py里写入对应的方法;
from django.http import HttpResponse
from django.shortcuts import render
from django.template import loader
from yuaneuro.models import Student
import random
def hello(request):
return render(request, 'hello.html')
def stu(request):
stu = Student()
stu.s_name = 'yc%d' % random.randrange(100)
stu.save() # 保存数据
context = {'stu': stu.s_name}
return render(request, 'stu.html', context)
"""
def get_stu(request):
stus = Student.objects.all()
context = {'stus': stus}
return render(request, 'get_stu.html', context)
"""
def get_stu(request):
stus = Student.objects.all() # Student.objects.all()代表去所有数据。类似sql语句中的`select * from Student
html = loader.get_template('get_stu.html')
context = {'stus': stus}
resault = html.render(context=context)
print(resault)
return HttpResponse(resault)
def update_stu(request):
stu = Student.objects.get(pk=2) # Student.objects.get(pk=xxx)代表取主码为xxx的数据
stu.s_name = 'cyqqq'
stu.save()
return render(request, 'update_stu.html', {'stu': stu.s_name})
def del_stu(request):
stu = Student.objects.get(pk=3)
stu.delete()
return render(request, 'del_stu.html', {'stu': stu.s_name})
Student.objects.get(pk=xxx)
代表取主码为xxx的数据,然后在下面进行操作,delete()
或者修改后save()
Student.objects.all()
代表去所有数据。类似sql语句中的select * from Student
然后再templates
中创建html创建对应的html显示增删改查的结果:
这里只举一个例子get_stu.html
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>get_stu</title>
</head>
<body>
<h1>
{% for stu in stus %}
<li>
{{ stu.s_name }}
</li>
{% endfor %}
</h1>
</body>
</html>