- Django 基本概念
- Django - 首页
- Django - 基础
- Django - 概述
- Django - 环境搭建
- Django - 创建项目
- Django - 应用生命周期
- Django - 创建视图
- Django - URL映射
- Django - 首页
- Django - 模板系统
- Django - MVT
- Django - 添加主模板
- Django Admin
- Django Admin - 界面
- Django Admin - 创建用户
- Django Admin - 包含模型
- Django Admin - 设置显示字段
- Django Admin - 更新对象
- Django 模型
- Django - 模型
- Django - 插入数据
- Django - 更新数据
- Django - 删除数据
- Django - 更新模型
- Django 静态文件
- Django - 添加静态文件
- Django - 添加 CSS 文件
- Django 高级
- Django - 404 页面未找到
- Django - 页面重定向
- Django - 发送邮件
- Django - 通用视图
- Django - 表单处理
- Django - 文件上传
- Django - Apache 设置
- Django - Cookie 处理
- Django - Session
- Django - 缓存
- Django - 评论
- Django - RSS
- Django - AJAX
- Django 有用资源
- Django - 快速指南
- Django - 有用资源
- Django - 讨论
Django - 模型
模型是一个类,它代表数据库中的表或集合,其中类的每个属性都是表或集合的字段。模型定义在 app/models.py 中(在我们的例子中:myapp/models.py)
创建模型
以下是一个名为 Dreamreal 的示例模型:
from django.db import models class Dreamreal(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 = "dreamreal"
每个模型都继承自 django.db.models.Model。
我们的类有 4 个属性(3 个 CharField 和 1 个 Integer),它们将成为表的字段。
带有 db_table 属性的 Meta 类允许我们定义实际的表或集合名称。Django 会自动命名表或集合:myapp_modelName。这个类允许你强制将表名设置为你想要的名称。
创建模型后,你需要 Django 来生成实际的数据库:
$python manage.py syncdb
数据操作 (CRUD)
让我们创建一个名为 "crudops" 的视图来了解如何对模型执行 CRUD 操作。我们的 myapp/views.py 将如下所示:
myapp/views.py
from myapp.models import Dreamreal from django.http import HttpResponse def crudops(request): #Creating an entry dreamreal = Dreamreal( website = "www.polo.com", mail = "[email protected]", name = "sorex", phonenumber = "002376970" ) dreamreal.save() #Read ALL entries objects = Dreamreal.objects.all() res ='Printing all Dreamreal entries in the DB : <br>' for elt in objects: res += elt.name+"<br>" #Read a specific entry: sorex = Dreamreal.objects.get(name = "sorex") res += 'Printing One entry <br>' res += sorex.name #Delete an entry res += '<br> Deleting an entry <br>' sorex.delete() #Update dreamreal = Dreamreal( website = "www.polo.com", mail = "[email protected]", name = "sorex", phonenumber = "002376970" ) dreamreal.save() res += 'Updating entry<br>' dreamreal = Dreamreal.objects.get(name = 'sorex') dreamreal.name = 'thierry' dreamreal.save() return HttpResponse(res)
其他数据操作
让我们探索一下我们可以在模型上执行的其他操作。请注意,CRUD 操作是在模型的实例上执行的,现在我们将直接使用表示模型的类。
让我们在 **myapp/views.py** 中创建一个 'datamanipulation' 视图
from myapp.models import Dreamreal from django.http import HttpResponse def datamanipulation(request): res = '' #Filtering data: qs = Dreamreal.objects.filter(name = "paul") res += "Found : %s results<br>"%len(qs) #Ordering results qs = Dreamreal.objects.order_by("name") for elt in qs: res += elt.name + '<br>' return HttpResponse(res)
模型关联
Django ORM 提供了三种关联模型的方式:
我们将在这里看到的第一个例子是一对多关系。正如你在上面的例子中看到的,Dreamreal 公司可以有多个在线网站。通过使用 django.db.models.ForeignKey 来定义这种关系:
myapp/models.py
from django.db import models class Dreamreal(models.Model): website = models.CharField(max_length = 50) mail = models.CharField(max_length = 50) name = models.CharField(max_length = 50) phonenumber = models.IntegerField() online = models.ForeignKey('Online', default = 1) class Meta: db_table = "dreamreal" class Online(models.Model): domain = models.CharField(max_length = 30) class Meta: db_table = "online"
正如你在更新后的 myapp/models.py 中看到的,我们添加了 online 模型并将其与 Dreamreal 模型关联。
让我们通过 manage.py shell 检查这一切是如何工作的:
首先,让我们在 Django shell 中创建一些公司(Dreamreal 条目)进行测试:
$python manage.py shell >>> from myapp.models import Dreamreal, Online >>> dr1 = Dreamreal() >>> dr1.website = 'company1.com' >>> dr1.name = 'company1' >>> dr1.mail = 'contact@company1' >>> dr1.phonenumber = '12345' >>> dr1.save() >>> dr2 = Dreamreal() >>> dr1.website = 'company2.com' >>> dr2.website = 'company2.com' >>> dr2.name = 'company2' >>> dr2.mail = 'contact@company2' >>> dr2.phonenumber = '56789' >>> dr2.save()
现在是一些托管域名:
>>> on1 = Online() >>> on1.company = dr1 >>> on1.domain = "site1.com" >>> on2 = Online() >>> on2.company = dr1 >>> on2.domain = "site2.com" >>> on3 = Online() >>> on3.domain = "site3.com" >>> dr2 = Dreamreal.objects.all()[2] >>> on3.company = dr2 >>> on1.save() >>> on2.save() >>> on3.save()
从在线域名访问托管公司(Dreamreal 条目)的属性很简单:
>>> on1.company.name
如果我们想知道 Dreamreal 中所有由公司托管的在线域名,我们将使用以下代码:
>>> dr1.online_set.all()
要获取 QuerySet,请注意我们之前看到的所有操作方法(filter、all、exclude、order_by……)
你也可以访问链接模型的属性进行过滤操作,例如,你想获取所有 Dreamreal 名称包含 'company' 的在线域名:
>>> Online.objects.filter(company__name__contains = 'company'
**注意** - 此类查询仅支持 SQL 数据库。它不适用于不存在连接且有两个 '_' 的非关系型数据库。
但这并不是关联模型的唯一方法,你还可以使用 OneToOneField,这是一种保证两个对象之间关系唯一的关联。如果我们在上面的例子中使用 OneToOneField,这意味着每个 Dreamreal 条目只有一个 Online 条目,反之亦然。
最后一个是 ManyToManyField,用于表之间的 (n-n) 关系。请注意,这些与基于 SQL 的数据库相关。