django 模型——迹忆客-ag捕鱼王app官网
django 模型(model) 是表示我们数据库中的表或集合的类,类的每个属性都是表或集合的一个字段。模型在 models.py 中定义。在我们的示例中是在 app/models.py 中
先来温习一下我们的 app应用程序的目录结构和整个项目 firstproject 的目录结构
app 应用目录结构
firstproject 项目目录结构
接下来我们所有的模型示例都是在 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 admin 管理界面来管理我们新建的模型。此类可视化的界面使用起来还是比较方便的
在 app/admin.py 文件中注册我们新创建的模型
from django.contrib import admin
from app.models import usermodel
admin.site.register(usermodel)
然后登录我们的django admin 管理系统,可以看到我们新注册的模型。这就说明我们的模型已经创建成功了
此时我们的表还都是空的,下面我们开始对表进行一些操作
操作数据 (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 admin 管理界面,查看usermodel模型的结果如下
除了可以对模型进行基本的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 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
命令执行成功之后,会在数据库中查到我们新建的两张表
然后我们使用 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()
下面我们查一下数据
从 programmer 模型访问 language的属性方法是比较简单的
>>> pm1.language.language
'php'
反过来如果我们想查看 language模型中某个语言都有哪些程序员使用,可以使用以下代码
>>> lan1.programmer_set.all()
, ]>
除了上面我们介绍的 一对多的关系 ,还有 onetoonefield,这是一个保证两个对象之间关系唯一的链接。然后就是表之间的 (nn) 关系的 manytomanyfield。请注意,这些与基于 sql 的数据库相关。