Django 模型

Django 模型(Model) 是表示我们数据库中的表或集合的类,类的每个属性都是表或集合的一个字段。模型在 models.py 中定义。在我们的示例中是在 app/models.py 中

先来温习一下我们的 app应用程序的目录结构和整个项目 firstProject 的目录结构

app 应用目录结构

Django app应用目录结构

firstProject 项目目录结构

Django 项目目录结构

接下来我们所有的模型示例都是在 app中的 models.py 中进行定义。

提示: 本教程使用的是 Django默认的数据库 SQLite。 对 SQLite不了解且对其感兴趣的可以查看我们的 SQLite教程。 也可以选择自己熟悉的数据库 MySQL,PostgreSQL等。

创建模型

下面我们创建一个模型 DjangoModel

from django.db import models

class UserModel(models.Model):

   website = models.CharField(max_length = 50)
   mail = models.CharField(max_length = 50)
   name = models.CharField(max_length = 50)
   phonenumber = models.IntegerField()

   class Meta:
      db_table = "user_model"

所有的自定义模型都要继承 django.db.models.Model。只有继承它才能使用提供给模型的一些方法。

上面我们定义的类有 4 个属性,其中 3 个字符串 和 1 个整数。反映到表中 这 4 个属性表示表中的4个字段。

Meta 的属性 db_table 是用来定义表的名称或者集合的名称。如果我们不指定的话,Django 模型将会自动给我们命名一个表名 app_userModel。这肯定不会是我们想要的,所以在定义模型的时候不要忘了使用 db_table 给指定一个合适的表名。

模型定义完成了,下面我们就来生成实际的数据库,使用下面的命令来生成

$ python3 manage.py makemigrations app  # 首先使Django知道我们的app中模型有变化
Migrations for 'app':
  app/migrations/0001_initial.py
    - Create model UserModel
$ python3 manage.py migrate app   # 然后 创建表结构
Operations to perform:
  Apply all migrations: app
Running migrations:
  Applying app.0001_initial... OK

创建完成之后,我们可以进入数据库查看我们刚才创建的表

$ sqlite3 db.sqlite3

> .tables
...
user_model

Django SQLite 查看创建的表

我们也可以通过之前介绍的Django Admin 管理界面来管理我们新建的模型。此类可视化的界面使用起来还是比较方便的

在 app/admin.py 文件中注册我们新创建的模型

from django.contrib import admin

from app.models import UserModel

admin.site.register(UserModel)

然后登录我们的Django Admin 管理系统,可以看到我们新注册的模型。这就说明我们的模型已经创建成功了

Django 管理界面模型展示

此时我们的表还都是空的,下面我们开始对表进行一些操作

操作数据 (CRUD)

我们创建一个 user 视图,在视图中我们定义对模型 UserModel的CURD操作。

app/views.py

def user(request):

    # 添加一条记录
    userData = UserModel(
        website="www.jiyik.com", mail="jiyi_onmpw@163.com",
        name="迹忆客", phonenumber="13983726152"
    )

    userData.save()  # 保存数据,添加一条记录

    # 检索所有记录
    objects = UserModel.objects.all()
    res = '表中的所有记录在此 : <br>'

    for elt in objects:
        res += elt.name + "<br>"

    # Read a specific entry:
    google = UserModel.objects.get(name="Google")
    res += '指定名称的记录 <br>'
    res += google.name

    # 删除一条记录
    res += '<br> 删除一条记录 <br>'
    google.delete()

    # 更新
    res += '更新 记录<br>'

    jiyik = UserModel.objects.get(name='迹忆客')
    jiyik.name = 'JIYIK'
    jiyik.save()

    return HttpResponse(res)

然后定义一个路由

app/urls.py

from django.urls import path, re_path

from . import views

urlpatterns = [
    path('hello/', views.hello),
    path('user/', views.user)
]

访问 /app/user 结果如下

Django 模型基础操作

此时看我们的Django Admin 管理界面,查看UserModel模型的结果如下

Django 管理界面模型数据

Django 管理界面模型中的特定一条数据

除了可以对模型进行基本的CURD操作之外,我们还可以做一些其他的操作,例如 排序、过滤等。

在app/views.py 中创建一个视图 data

def data(request):
    res = ''

    # 过滤数据:
    qs = UserModel.objects.filter(name="JIYIK")
    res += "发现 : %s 条结果<br>" % len(qs)

    # 查找结果排序
    qs = UserModel.objects.order_by("name")

    for elt in qs:
        res += elt.name + '<br>'

    return HttpResponse(res)

然后创建一个路由 /app/data

from django.contrib import admin
from django.urls import path, re_path

from . import views

urlpatterns = [
    path('hello/', admin.site.urls),
    path('user/', views.user),
    path('data/', views.data)
]

访问结果如下

Django-模型其他操作


链接模型

Django ORM 提供了 3 种链接模型的方法,分别对应了三种关系

我们这里用一对多关系举例

我们新建一个 Programmer 模型和一个 Language模型。其中,每一门编程语言对应多个Programmer 中的程序员。我们可以使用 django.db.models.ForeignKey 定义这种关系

app/models.py

class Programmer(models.Model):
    name = models.CharField(max_length=50)
    language = models.ForeignKey('Language', default=1, on_delete=models.CASCADE)

    class Meta:
        db_table = "programmer"


class Language(models.Model):
    language = models.CharField(max_length=30)

    class Meta:
        db_table = "language"

通过上面的示例,我们新建了一个 Language 模型,并且将其链接到我们的Programmer模型。

接下来我们创建表

$ python3 manage.py makemigrations app
$ python3 manage.py migrate app

命令执行成功之后,会在数据库中查到我们新建的两张表

Django-创建关系模型

然后我们使用 manage.py shell 来创建几门编程语言

$ python3 manage.py shell

>>> from app.models import Language, Programmer
>>> 
>>> lan1 = Language()
>>> lan1.language = "php"
>>> lan1.save()
>>> lan2 = Language()
>>> lan2.language = "python"
>>> lan2.save()
>>> lan3 = Language()
>>> lan3.language = "golang"
>>> lan3.save()

接着我们录取两个程序员

>>> pm1 = Programmer()
>>> pm1.name = "Tom"
>>> pm1.language = lan1
>>> pm1.save()
>>> pm2 = Programmer()
>>> pm2.name = "Jerry"
>>> pm2.language = lan1
>>> pm2.save()
>>> pm3 = Programmer()
>>> pm3.name = "Jiyik"
>>> pm3.language = lan2
>>> pm3.save()

下面我们查一下数据

Django-模型查看关系表数据

从 Programmer 模型访问 Language的属性方法是比较简单的

>>>  pm1.language.language
'php'

反过来如果我们想查看 Language模型中某个语言都有哪些程序员使用,可以使用以下代码

>>> lan1.programmer_set.all()
<QuerySet [<Programmer: Programmer object (1)>, <Programmer: Programmer object (2)>]>

除了上面我们介绍的 一对多的关系 ,还有 OneToOneField,这是一个保证两个对象之间关系唯一的链接。然后就是表之间的 (nn) 关系的 ManyToManyField。请注意,这些与基于 SQL 的数据库相关。

查看笔记

扫码一下
查看教程更方便