• 众所周知,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类型,最大长度为16
  • s_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>

最后修改:2021 年 12 月 31 日
如果觉得我的文章对你有用,请随意赞赏