烦恼一般都是想太多了。

0%

Django中的Models

Django 中有一个 ORM (对象关系模型,Object Relation Model)系统,在 Python 对象与数据库表间进行映射。对于这个 Model 是什么我们就需要来看一下了。根据官方定义,每个 模型 模型是有关数据的唯一确定的信息源,它包含了我们需要存储的数据的重要的字段及行为。通常,每个 模型 映射到数据库中的一张表。

基本上:

  • 每个 模型 都是一个 Python 类,其继承自 django.db.models.Model
  • 模型 的每个属性都代表了数据库表中的字段
  • 有了这些,Django为您提供了一个自动生成的数据库访问API。使我们能进行 数据库查询

也就是说,我们用 Python 的类来定义我们的 模型,就能通过这个模型创建数据,丢到数据库去了。

例子

比如,我们建立一个 Person 模型:

from django.db import models

class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)

我们定义了两个字段, first_name, last_name

我们执行命令:

python manage.py makemigrations polls
Migrations for 'polls':
polls/migrations/0001_initial.py
- Create model Person

这个命令会检测我们对文件的修改,并边修改的部分存储为一次 迁移,由于我们是第一次修改,所以其有 initial 字样。

我们执行命令:

python manage.py sqlmigrate polls 0001

这可以让我们得出 SQL 语句的输出:

BEGIN;
--
-- Create model Person
--
CREATE TABLE "polls_person" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "first_name" varchar(30) NOT NULL, "last_name" varchar(30) NOT NULL);
COMMIT;

如果我们为模型再增加一个 middle_name 字段,我们可以来对比一下前后的内容:

class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
middle_name = models.CharField(max_length=30,default='')
python manage.py makemigrations polls
Migrations for 'polls':
polls/migrations/0002_person_middle_name.py
- Add field middle_name to person
python manage.py sqlmigrate polls 0002
BEGIN;
--
-- Add field middle_name to person
--
CREATE TABLE "new__polls_person" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "middle_name" varchar(30) NOT NULL, "first_name" varchar(30) NOT NULL, "last_name" varchar(30) NOT NULL);
INSERT INTO "new__polls_person" ("id", "first_name", "last_name", "middle_name") SELECT "id", "first_name", "last_name", '' FROM "polls_person";
DROP TABLE "polls_person";
ALTER TABLE "new__polls_person" RENAME TO "polls_person";
COMMIT;

这将会把原来的表删除,然后把新表的数据插入。

最后,我们把这个模型变更应用到数据库:

python manage.py migrate
Operations to perform:
Apply all migrations: polls
Running migrations:
Applying polls.0001_initial... OK
Applying polls.0002_person_middle_name... OK

将会逐个应用我们的 迁移 文件。

使用

现在我们已经建立了一个模型 Person,现在我们来使用他。先进入我们的 django shell

python manage.py shell

我们之前已经说过,一个模型就是一张表,所以我们可以在这个模型上进行查询(对表进行查询,修改等操作).

>>> from polls.models import Person
>>> Person.objects.all() # 暂无对象
<QuerySet []>
>>> p = Person(first_name='gowa',last_name='json') # 创建对象
>>> p.save() # 存储到数据库
>>> p.id # 查看ID
1
>>> Person.objects.all() # 已经有对象
<QuerySet [<Person: Person object (1)>]>