Django 模型
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 = '表中的所有记录在此 : <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 Admin 管理界面,查看UserModel模型的结果如下
除了可以对模型进行基本的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 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()
<QuerySet [<Programmer: Programmer object (1)>, <Programmer: Programmer object (2)>]>
除了上面我们介绍的 一对多的关系 ,还有 OneToOneField,这是一个保证两个对象之间关系唯一的链接。然后就是表之间的 (nn) 关系的 ManyToManyField。请注意,这些与基于 SQL 的数据库相关。