Django模型
Django模型是Django用来创建表、其字段和各种约束的内置功能。简而言之,Django模型就是人们使用Django的数据库的SQL。SQL(结构化查询语言)很复杂,在创建、删除、更新或任何其他与数据库有关的东西时,涉及到很多不同的查询。Django模型简化了这些任务,并将表组织到模型中。一般来说,每个模型映射到一个数据库表。
这篇文章围绕着如何使用Django模型来方便地在数据库中存储数据。此外,我们可以使用Django的管理面板来创建、更新、删除或检索模型的字段以及各种类似操作。Django模型提供了简单性、一致性、版本控制和高级元数据处理。模型的基本原理包括
- 每个模型都是一个Python类,其子类为django.db.models.Model。
-
模型的每个属性代表一个数据库字段。
-
有了这些,Django给你提供了一个自动生成的数据库访问API;见《制作查询》。
示例 –
from django.db import models
# Create your models here.
class GeeksModel(models.Model):
title = models.CharField(max_length = 200)
description = models.TextField()
Django将Django模型中定义的字段映射为数据库的表字段,如下图所示。
使用Django模型
要使用Django模型,需要有一个项目和一个应用程序在其中工作。当你启动一个应用程序后,你可以在app/models.py中创建模型。在开始使用模型之前,让我们看看如何启动一个项目并创建一个名为geeks.py的应用程序。
创建一个模型
语法
from django.db import models
class ModelName(models.Model):
field_name = models.Field(**options)
要创建一个模型,在geeks/models.py中输入代码。
# import the standard Django Model
# from built-in library
from django.db import models
# declare a new model with a name "GeeksModel"
class GeeksModel(models.Model):
# fields of the model
title = models.CharField(max_length = 200)
description = models.TextField()
last_modified = models.DateTimeField(auto_now_add = True)
img = models.ImageField(upload_to = "images/")
# renames the instances of the model
# with their title name
def __str__(self):
return self.title
每当我们创建一个模型,删除一个模型,或者在我们项目的任何models.py中更新任何东西。makemigrations基本上为预装的应用(可以在settings.py中的install apps中查看)和你新创建的应用的模型(你在install apps中添加的)生成SQL命令,而migrate则在数据库文件中执行这些SQL命令。
因此,当我们运行时。
Python manage.py makemigrations
创建上述模型的SQL查询,作为一个表被创建,并且
Python manage.py migrate
在数据库中创建表。
现在我们已经创建了一个模型,我们可以执行各种操作,比如为表创建一个行,或者就Django而言,创建一个模型的实例。要了解更多信息,请访问 – Django基本应用模型 – Makemigrations和Migrate
在Django管理界面渲染一个模型
要在Django admin中渲染一个模型,我们需要修改app/admin.py。进入geeks应用中的admin.py,输入以下代码。从models.py中导入相应的模型,并将其注册到管理界面中。
from django.contrib import admin
# Register your models here.
from .models import GeeksModel
admin.site.register(GeeksModel)
现在我们可以在Django Admin中检查模型是否已经被渲染。Django管理界面可用于图形化地实现CRUD(创建、检索、更新、删除)。
要查看更多关于在Django管理中渲染模型的信息,请访问 – Django管理界面的渲染模型
Django CRUD – 插入、更新和删除数据
Django让我们与它的数据库模型进行交互,即添加、删除、修改和查询对象,使用一个叫做ORM(Object Relational Mapper)的数据库抽象API。我们可以通过在我们的项目目录下运行以下命令来访问Django ORM。
python manage.py shell
添加对象。
为了创建一个模型Album的对象并将其保存到数据库中,我们需要编写以下命令。
>>>> a = GeeksModel(
title = "GeeksForGeeks",
description = "A description here",
img = "geeks/abc.png"
)
>>> a.save()
Retrieving objects
为了检索一个模型的所有对象,我们编写以下命令。
>>> GeeksModel.objects.all()
<QuerySet [<GeeksModel: Divide>, <GeeksModel: Abbey Road>, <GeeksModel: Revolver>]>
修改现有对象
我们可以按以下方式修改现有对象。
>>> a = GeeksModel.objects.get(id = 3)
>>> a.title = "Pop"
>>> a.save()
Deleting objects
要删除一个对象,我们需要编写以下命令。
>>> a = Album.objects.get(id = 2)
>>> a.delete()
查看Django的ORM(对象)的详细帖子,请访问Django ORM – 插入、更新和删除数据。
对模型中的字段进行验证
Django模型中的内置字段验证是所有Django字段预定义的默认验证。每个字段都有来自Django验证器的内置验证。例如,IntegerField内置验证,它只能存储整数值,而且是在一个特定范围内。
在geeks应用程序的models.py文件中输入以下代码。
from django.db import models
from django.db.models import Model
# Create your models here.
class GeeksModel(Model):
geeks_field = models.IntegerField()
def __str__(self):
return self.geeks_field
在Django上运行了makemigrations和migrate并渲染了上述模型后,让我们尝试用字符串 “GfG is Best “创建一个实例。
你可以在管理界面看到,人们不能在IntegerField中输入字符串。同样的,每个字段都有自己的验证方法。
基本模型数据类型和字段列表
模型最重要的部分和唯一需要的部分是它定义的数据库字段列表。字段是由类属性指定的。下面是Django中使用的所有字段类型的列表。
字段名称 | 描述 |
---|---|
AutoField | 它是一个自动递增的IntegerField。 |
BigAutoField | 它是一个64位的整数,和AutoField很像,只是它能保证适合从1到9223372036854775807的数字。 |
BigIntegerField | 它是一个64位的整数,和IntegerField很像,只是它能保证适合从-9223372036854775808到9223372036854775807的数字。 |
BinaryField | 一个用于存储原始二进制数据的字段。 |
BooleanField | 一个真/假字段。这个字段的默认窗体部件是一个CheckboxInput。 |
CharField | 它是为小到大的输入而设置的字符串。 |
DateField | 一个日期,在Python中用一个datetime.date实例表示。它用于日期和时间,在Python中用一个datetime.datetime实例表示。 |
DecimalField | 它是一个固定精度的十进制数,在Python中用一个Decimal实例表示。 |
DurationField | 一个用于存储时间段的字段。 |
EmailField | 这是一个CharField,用于检查值是否为有效的电子邮件地址。 |
FileField | 这是一个文件上传字段。 |
FloatField | 它是一个浮点数,在Python中由一个float实例表示。 |
ImageField | 它继承了FileField的所有属性和方法,但也验证了上传对象是有效的图像。 |
IntegerField | 它是一个整数字段。从-2147483648到2147483647的值在Django支持的所有数据库中都是安全的。 |
GenericIPAddressField | 一个IPv4或IPv6地址,字符串格式(如192.0.2.30或2a02:42fe::4)。 |
NullBooleanField | 类似于BooleanField,但允许NULL作为选项之一。 |
PositiveIntegerField | 和IntegerField一样,但必须是正数或零(0)。 |
PositiveSmallIntegerField | 类似于PositiveIntegerField,但只允许在某个(与数据库有关的)点下取值。 |
SlugField | Slug是一个报纸术语。蛞蝓是某种事物的简短标签,只包含字母、数字、下划线或连字符。它们通常用于URLs中。 |
SmallIntegerField | 它就像IntegerField,但只允许在某个(与数据库有关的)点以下的值。 |
TextField | 一个大的文本字段。这个字段的默认窗体部件是一个文本区域。 |
TimeField | 一个时间,在Python中用一个datetime.time实例表示。 |
URLField | 一个URL的CharField,由URLValidator验证。 |
UUIDField | 一个用于存储通用唯一标识符的字段。使用 Python 的 UUID 类。当在PostgreSQL上使用时,它以uuid数据类型存储,否则以char(32)存储。 |
关系字段
Django还定义了一组代表关系的字段。
字段名称 | 描述 |
---|---|
ForeignKey | 一个多对一的关系。需要两个位置参数:模型所涉及的类和on_delete选项。 |
ManyToManyField | 一个多对多的关系。需要一个位置参数:模型与之相关的类,其作用与对ForeignKey的作用完全相同,包括递归和懒惰关系。 |
OneToOneField | 一个一对一的关系。从概念上讲,这类似于unique=True的ForeignKey,但关系的 “反面 “将直接返回单个对象。 |