1. 什么是MTV?
MTV是Django的核心概念之一,其中M、T、V分别代表Model、Template和View。在Django中,MVC模式被归类为MTV模式,其中控制器变为了视图(View),模板没有更改而模型(Model)作为模板和视图的桥梁。在MTV中,模型负责处理应用程序中的数据,“视图”则负责渲染用户看到的数据而模板负责定义网页的最终格局。
2. Model
在Django中,模型由Python类表示,这些类继承自django.db.models.Model类。 模型类充当数据库表中数据的容器,它们是数据访问层(Data Access Layer)中的核心组件。在模型类中,您可以定义存储在数据库中的数据的字段及其验证要求。模型类还可以定义方法,这些方法可以操作存储在数据库中的数据。
2.1 创建模型
首先,要定义一个模型,我们需要在项目中的一个应用程序中创建一个models.py
文件。此文件包含我们将定义数据结构的模型定义。我们使用class
命令创建模型。
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.CharField(max_length=200)
price = models.DecimalField(max_digits=5, decimal_places=2)
在这个例子中,我们定义一个"Book"数据结构,它拥有"Title","Author","Price"三个属性。从models.Model
继承指令表示该类是一个模型。
现在我们定义好了模型,接下来我们需要通过支持的数据库引擎将该模型映射到相应的关系数据库表。我们可以通过运行如下命令,将这些信息保存到Django框架的“迁移”(Migration)系统中:
python manage.py makemigrations
运行上述命令后,会在应用程序中创建一个迁移文件。在默认的情况下,生成的迁移文件将放在myapp/migrations
文件夹下。然后运行如下命令将其应用到数据库中:
python manage.py migrate
2.2 模型字段
Django为您提供了各种模型字段来存储数据和验证该数据的区域。可用字段的一个完整列表可以在官方文档中找到。 下面列出一些常用字段类型和它们的简要说明:
CharField(max_length=N):将文本存储为字符串,最大长度为N字符。 例如,标题可以存储为CharField,因为标题必须是文本字符串。
TextField():用于存储可以包含大量文本(如文章,帖子等)的字符串。
BooleanField():用于存储布尔(True / False)值。
DateField()和DateTimeField():将日期和时间存储到数据库中。
IntegerField():将整数存储到数据库中。
DecimalField(max_digits=None,decimal_places=None):类似于FloatField(),但保留精度,常用于存储货币值。
2.3 模型关系
在许多情况下,我们会为模型添加关系,这些关系说明模型之间的依赖性或层次结构。以下是几种最常见的字段类型:
ForeignKey:用于与另一个模型的实例建立关系。例如,一个图书模型可以具有多个评分,因此我们可以创建一个Rating模型,然后将Book实例的ForeignKey用作该评分的一部分。
ManyToManyField:与ForeignKey类似,但是给出的是多个书籍。例如,一个购物车可能会包含多个不同的书,而不是每个书籍只能有一个购物车。
OneToOneField:与ForeignKey类似,但是与模型实例的OneToOne关系建立连接。
2.4 模型查询
Django ORM提供了一组完整的API,允许您执行复杂的数据查询。以下是一些示例,以了解上述文本定义的Book模型如何执行查询:
#查询所有书籍的记录
books = Book.objects.all()
#查询所有包含 "Django" 关键字的书籍记录
books = Book.objects.filter(title__contains='Django')
#查询价格高于30美元的书籍记录
books = Book.objects.filter(price__gt=30)
#查询 "Tom Jones" 是作者的所有书籍记录
books = Book.objects.filter(author__exact='Tom Jones')
2.5 自定义方法
模型类中的方法是与模型记录对象一起使用的函数。这意味着这些方法对单个模型记录对象或静态方法(与类但不与实例绑定)非常有用。例如,假设您有一个简单的图书类,您可以用如下方式编写该类的方法:
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.CharField(max_length=200)
price = models.DecimalField(max_digits=5, decimal_places=2)
def __str__(self):
return self.title
def is_expensive(self):
return self.price > 50
在这个例子中,我们定义了一个__str__()
方法,它返回书籍的标题。我们还定义了一个is_expensive()
方法,它根据书籍的价格返回两种布尔值——True或False。
2.6 模型管理器
管理器是一种允许您以特定方式对查询和读取模型记录进行预处理的对象。管理器的定义通常发生在模型中定义的类中,并可以让您轻松地实现软删除或其他查询工具。模型管理器由models.Manager()
类表示,您可以像下面这样轻松定义管理器:
class BookManager(models.Manager):
def title_count(self, keyword):
return self.filter(title__icontains=keyword).count()
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.CharField(max_length=200)
price = models.DecimalField(max_digits=5, decimal_places=2)
objects = BookManager()
在这段代码中,我们定义了一个名为title_count()
的新管理器方法,它接受一个关键字并返回包含该关键字的书籍标题的计数。我们使用models.Manager()
基类定义了一个名为BookManager的新管理器,该基类允许我们创建我们自己的自定义方法。然后,将自定义管理器分配给对象属性objects
,使我们可以轻松使用该管理器在Book
类的任何实例上使用。
3. 总结
在本文中,我们介绍了Django框架的MTV之Model概念,它是构建Django应用程序的重要组成部分。我们了解了如何创建模型,定义模型字段和模型关系,并使用模型管理器自定义方法。Django框架的模型减轻了Web开发者的负担,他们可以专注于应用程序的功能而不必为管理数据存储和访问方面的细节而烦恼。
通过Django框架的模型,我们只需使用少量的Python代码就可以构建复杂的数据模型。因此,Django框架非常适合需要管理和操作大量数据的Web应用程序。如果你想要进一步学习Django框架的模型,我强烈建议你查阅Django官方文档。