Django学习之二 项目和应用

一、项目和应用

在Django中,像上一节那样的一套目录结构和其中的设置就是一个Django可识别的项目。
应用指的就是一组Model(数据模型)、Views(视图)、Templates(模板)和URLs的集合。
Django框架通过使用应用,为站点提供各种功能,应用还可以被复用在不同的项目中。你可以将一个项目理解为一个站点,站点中包含很多功能,比如博客,wiki,论坛,每一种功能都可以看作是一个应用。

二、创建应用

在命令行窗口中,进入项目根目录,即manage.py所在的目录
python manage.py startapp blog
应用创建成功后的目录结构如下:
blog
   __init__.py
   admin.py        模型注册到管理后台,默认定义了 BlogConfig 类(应用名+Config命名)
   apps.py         应用的主配置文件
   models.py       应用的数据模型
   tests.py
   views.py        应用的业务逻辑
   migrations      数据库迁移记录
      __init__.py

数据模型 是继承了 django.db.models.Model 的类
Django为创建和操作数据模型提供了ORM,为在models.py 文件中定义的每一个类,在数据库中创建对应的数据表。
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User


class Post(models.Model):
    STATUS_CHOICES = (('draft', 'Draft'), ('published', 'Published'))
    title = models.CharField(max_length=250)
    slug = models.SlugField(max_length=250, unique_for_date='publish')
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blog_posts')
    body = models.TextField()
    publish = models.DateTimeField(default=timezone.now)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft')

    class Meta:
        ordering = ('-publish',)

    def __str__(self):
        return self.title


数据模型的字段定义可参考
https://docs.djangoproject.com/en/2.2/ref/models/fields/

三、激活应用

在项目的 settings.py 文件中添加 'blog.apps.BlogConfig' 到 INSTALLED_APPS,如:
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog.apps.BlogConfig',
]

四、迁移

进入项目的根目录,执行 python manage.py makemigrations blog
D:\work\code\python\django_01>python manage.py makemigrations blog
Migrations for 'blog':
  blog\migrations\0001_initial.py
    - Create model Post

该命令执行后会在blog 应用下的migrations 目录里新增一个0001_initial.py 文件,可以打开该文件看一下迁移数据是什么样子的。一个迁移数据文件里包含了与其他迁移数据的依赖关系,以及实际要对数据库执行的操作。
为了了解Django实际执行的SQL语句,可以使用sqlmigrate 加上迁移文件名,会列出要执行的SQL语句,但不会实际执行 python manage.py sqlmigrate blog 0001
D:\work\code\python\django_01>python manage.py sqlmigrate blog 0001
BEGIN;
--
-- Create model Post
--
CREATE TABLE "blog_post" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(250) NOT NULL, "slug" varchar(250) NOT NULL, "body" text NOT NULL, "publish" datetime NOT NULL, "created" datetime NOT NULL, "updated" datetime NOT NULL, "status" varchar(10) NOT NULL, "author_id" integer NOT NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED);
CREATE INDEX "blog_post_slug_b95473f2" ON "blog_post" ("slug");
CREATE INDEX "blog_post_author_id_dd7a8485" ON "blog_post" ("author_id");
COMMIT;
具体的sql细节可能会与上面的有变化,上边的输出针对SQLite数据库。可以看到表名被设置为应用名加上小写的类名( blog_post )也可以通过在Meta 类中使用db_table属性设置表名。Django自动为每个模型创建了主键,也可以通过设置某个模型字段参数primary_key=True 来指定主键。默认的主键列名叫做id ,和这个列同名的id 字段会自动添加到你的数据模型上。(即Post 类被Django添加了Post.id 属性)。

让数据库与新的数据模型进行同步,在命令行中输入下列命令:
D:\work\code\python\django_01>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
  Applying blog.0001_initial... OK

如果之后又编辑了models.py 文件,对已经存在的数据模型进行了增删改,或者又添加了新的数据模型,必须重新执行
makemigrations 创建新的数据迁移文件然后执行migrate 命令同步数据库。

本文内容到此结束,更多内容可关注公众号和个人微信号:

猜你喜欢

转载自blog.csdn.net/bowei026/article/details/92375203
今日推荐