教程 > django 教程 > 阅读:89

django 模型——迹忆客-ag捕鱼王app官网

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 = '表中的所有记录在此 : 
' for elt in objects: res = elt.name "
" # read a specific entry: google = usermodel.objects.get(name="google") res = '指定名称的记录
' res = google.name # 删除一条记录 res = '
删除一条记录
' google.delete() # 更新 res = '更新 记录
' 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 条结果
" % len(qs) # 查找结果排序 qs = usermodel.objects.order_by("name") for elt in qs: res = elt.name '
' 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()
, ]>

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

查看笔记

扫码一下
查看教程更方便
网站地图