• Django 初试水(二)


    这部分链接上一部分。将建立数据库,创建第一个模型,并主要关注 Django 提供的自动生成的管理页面。

    打开 mysite/setting.py 文件。这包含了 Django 项目设置的 Python 模块。通常,这个配置文件使用 SQLite 作为默认的数据库。

    在此,我只是作为试水,不打算切换数据库。当然有需要的,可以自己去使用一些更具扩展性的数据库,例如 PostgreSQL 等。

    如果你想使用其他数据库,你需要安装合适的 database bindings ,然后改变设置文件中 DATABASES 'default' 项目中的一些键值:

    • ENGINE -- 可选值有 'django.db.backends.sqlite3''django.db.backends.postgresql''django.db.backends.mysql'
    • 或 'django.db.backends.oracle'。其它 可用后端
    • NAME - 数据库的名称。如果使用的是 SQLite,数据库将是你电脑上的一个文件,在这种情况下, NAME 应该是此文件的绝对路径,包括文件名。默认值 os.path.join(BASE_DIR, 'db.sqlite3') 将会把数据库文件储存在项目的根目录。

    如果你不使用 SQLite,则必须添加一些额外设置,比如 USER 、 PASSWORD 、 HOST 等等。想了解更多数据库设置方面的内容,请看文档:DATABASES 。

     首先创建模型

    在 Django 里写一个数据库驱动的 web 应用第一步是定义模型,也就是数据库结构设计和附加的其他元数据。

    修改 polls/models.py 添加两个模型,一个是问题,一个是选项。

     1 from django.db import models
     2 
     3 
     4 class Question(models.Model):
     5     question_text = models.CharField(max_length=200)
     6     pub_date = models.DateTimeField('date published')
     7 
     8 
     9 class Choice(models.Model):
    10     question = models.ForeignKey(Question, on_delete=models.CASCADE)
    11     choice_text = models.CharField(max_length=200)
    12     votes = models.IntegerField(default=0)

    在这里,每个模型都由django的子类表示。 django.db.models.Model。每个模型都有许多类变量,每个类变量表示模型中的一个数据库字段

    每个字段都是 Field 类的实例 - 比如,字符字段被表示为 CharField ,日期时间字段被表示为 DateTimeField 。这将告诉 Django 每个字段要处理的数据类型。

    每个 Field 类实例变量的名字(例如 question_text 或 pub_date )也是字段名,所以最好使用对机器友好的格式。你将会在 Python 代码里使用它们,而数据库会将它们作为列名。

    你可以使用可选的选项来为 Field 定义一个人类可读的名字。这个功能在很多 Django 内部组成部分中都被使用了,而且作为文档的一部分。如果某个字段没有提供此名称,

    Django 将会使用对机器友好的名称,也就是变量名。在上面的例子中,我们只为 Question.pub_date 定义了对人类友好的名字。对于模型内的其它字段,它们的机器友好名也会被作为人类友好名使用。

    定义某些 Field 类实例需要参数。例如 CharField 需要一个 max_length 参数。这个参数的用处不止于用来定义数据库结构,也用于验证数据,我们稍后将会看到这方面的内容。

    Field 也能够接收多个可选参数;在上面的例子中:我们将 votes 的 default 也就是默认值,设为0。

    注意在最后,我们使用 ForeignKey 定义了一个关系。这将告诉 Django,每个 Choice 对象都关联到一个 Question 对象。Django 支持所有常用的数据库关系:多对一、多对多和一对一。

    激活模型

     上面的一小段代码给了 Django  很多信息。通过这些信息, Django 为这个应用

    1.创建数据库 schema

    2.创建可以与 Question(问题)和Choice(选项)对象进行交互的 Python 数据库 API 。

    首先,把应用 Polls 安装到项目。

    需要在配置类  INSTALLED_APPS 中添加设置。因为应用的 PollsConfig 写在文件 pollsapps.py 中。那么路径:'polls.apps.PollsConfig'

    在项目的 setting.py  文件中修改。修改后:

    1 INSTALLED_APPS = [
    2     'polls.apps.PollsConfig',
    3     'django.contrib.admin',
    4     'django.contrib.auth',
    5     'django.contrib.contenttypes',
    6     'django.contrib.sessions',
    7     'django.contrib.messages',
    8     'django.contrib.staticfiles',
    9 ]

    接下来执行命令行:

     1 # 通过运行 makemigrations 命令,Django 会检测你对模型文件的修改(在这种情况下,你已经取得了新的),并且把修改的部分储存为一次 迁移。
     2 E:workpy_djmysite>python manage.py makemigrations polls
     3 Migrations for 'polls':
     4   pollsmigrations001_initial.py
     5     - Create model Question
     6     - Create model Choice
     7 
     8 # 查看脚本
     9 E:workpy_djmysite>python manage.py sqlmigrate polls 0001
    10 BEGIN;
    11 --
    12 -- Create model Question
    13 --
    14 CREATE TABLE "polls_question" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "question_text" varchar(200) NOT NULL, "pub_date" datetime NOT NULL);
    15 --
    16 -- Create model Choice
    17 --
    18 CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL, "question_id" integer NOT NULL REFERENCES "polls_question" ("id") DEFERRABLE INITIALLY DEFERRED);
    19 CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id");
    20 COMMIT;
    21 
    22 #自动执行数据库迁移并同步管理你的数据库结构的命令
    23 E:workpy_djmysite>python manage.py migrate
    24 Operations to perform:
    25   Apply all migrations: admin, auth, contenttypes, polls, sessions
    26 Running migrations:
    27   Applying contenttypes.0001_initial... OK
    28   Applying auth.0001_initial... OK
    29   Applying admin.0001_initial... OK
    30   Applying admin.0002_logentry_remove_auto_add... OK
    31   Applying admin.0003_logentry_add_action_flag_choices... OK
    32   Applying contenttypes.0002_remove_content_type_name... OK
    33   Applying auth.0002_alter_permission_name_max_length... OK
    34   Applying auth.0003_alter_user_email_max_length... OK
    35   Applying auth.0004_alter_user_username_opts... OK
    36   Applying auth.0005_alter_user_last_login_null... OK
    37   Applying auth.0006_require_contenttypes_0002... OK
    38   Applying auth.0007_alter_validators_add_error_messages... OK
    39   Applying auth.0008_alter_user_username_max_length... OK
    40   Applying auth.0009_alter_user_last_name_max_length... OK
    41   Applying auth.0010_alter_group_name_max_length... OK
    42   Applying auth.0011_update_proxy_permissions... OK
    43   Applying polls.0001_initial... OK
    44   Applying sessions.0001_initial... OK

    注意:migrate 是一个强大的功能,这里没有详细的介绍。大家可以自己去了解。只要记住一下几步:

    改变模型需要这三步:

    • 编辑 models.py 文件,改变模型。
    • 运行 python manage.py makemigrations 为模型的改变生成迁移文件。
    • 运行 python manage.py migrate 来应用数据库迁移。

    使用  python manage.py shell 命令测试 API 吧!

     1 E:workpy_djmysite>python manage.py shell
     2 Python 3.7.4 (default, Aug  9 2019, 18:34:13) [MSC v.1915 64 bit (AMD64)]
     3 Type 'copyright', 'credits' or 'license' for more information
     4 IPython 7.8.0 -- An enhanced Interactive Python. Type '?' for help.
     5 
     6 In [1]: from polls.models import Choice,Question
     7 
     8 In [2]: Question.objects.all()
     9 Out[2]: <QuerySet []>
    10 
    11 In [3]: from django.utils import timezone
    12 
    13 In [4]: q = Question(question_text = "What's new?",pub_date = timezone.now())
    14 
    15 In [5]: q.save()
    16 
    17 In [6]: Question.objects.all()
    18 Out[6]: <QuerySet [<Question: Question object (1)>]>
    19 
    20 In [7]: q.id
    21 Out[7]: 1

    更多的可以自己去尝试:https://docs.djangoproject.com/en/3.0/topics/db/queries/

    介绍 Django 管理页面

    创建管理员账号

     1 #创建账号管理员命令
     2 E:workpy_djmysite>py manage.py createsuperuser
     3 Username (leave blank to use 'joint'): sailor
     4 Email address: sailor@explem.com
     5 Password:
     6 Password (again):
     7 This password is too short. It must contain at least 8 characters.
     8 This password is too common.
     9 This password is entirely numeric.
    10 Bypass password validation and create user anyway? [y/N]: y
    11 Superuser created successfully.

    这里用户名:sailor   password:123456 . 密码安全提示,最后确认创建Y。

    创建完毕启动服务:

    1 python manage.py runserver

    现在,打开浏览器,转到你本地域名的 "/admin/" 目录, -- 比如 "http://127.0.0.1:8000/admin/" 。你应该会看见管理员登录界面:

    登录

    a

    添加自己的应用

    修改 polls/admin.py 注册应用

    1 from django.contrib import admin
    2 
    3 from .models import Question
    4 
    5 admin.site.register(Question)

    刷新页面,开始便捷的可视化操作。

    a

    a

    a

  • 相关阅读:
    数据结构第二篇——线性表的顺序存储
    数据结构第一篇——线性表的逻辑结构
    面向对象之工资管理系统
    #ifndef三件套与#pragma once
    i++与++i的区别
    struct与class的区别(分别在c和c++中)
    浅析数据结构
    K60
    更新整理本人所有博文中提供的代码与工具(Java,2013.08)
    [置顶] cocos2d实现CCLabelTTF真正字体描边效果
  • 原文地址:https://www.cnblogs.com/why-home/p/12332255.html
Copyright © 2020-2023  润新知