Django 系列官方教程[2]Models and the admin site

续第一章,这章学习设置数据库,创建模型并介绍Django自动生成的后台。

一、安装数据库

现在打开mysite/settings.py,这是Django的python模型设置文件。

默认使用SQLite。我们如果知识对Django感兴趣,那么这个数据库就足够了,python自带SQLite,无需安装。

如果要开始一个真正的项目,我们需要使用类似PostgreSQL的可扩展数据库,从而避免半路更换数据库(会很麻烦)。

简单来说,SQLite适合个人使用,mysql能够满足多数web应用的需求,而PostgreSQL是目前最先进功能最全,相对也是最复杂的数据库。

这里以PostgreSQL为例,先安装。

sudo apt-get update
sudo apt-get install postgresql postgresql-client
sudo apt-get install python3-psycopg2
sudo apt-get install libpq-dev
pip3 install psycopg2

修改postgresql密码

sudo -i -u postgres
psql -U postgres
\password 

查看当前连接状态后在mysite\settings.py填入配置

\conninfo
DATABASES = {
    'default':{
       'ENGINE':'django.db.backends.postgresql_psycopg2',
       'NAME':'postgres',#数据库名字
       'USER':'postgres',#登录用户名
        'PASSWORD':'yourpassword',
        'HOST':'127.0.0.1',#数据库IP地址
        'PORT':'5432',
    }
}

我们还可以顺路设置时区,找个地方加入以下代码,然后运行zoneinfo.available_timezones()就可以获得可用的所有时区,这里简单点使用Hongkong。

import zoneinfo

from django.utils import timezone

class TimezoneMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        tzname = request.session.get('django_timezone')
        if tzname:
            timezone.activate(zoneinfo.ZoneInfo(tzname))
        else:
            timezone.deactivate()
        return self.get_response(request)

测试连接,一排ok过去就成功了。

python manage.py migrate

migrate会根据设置里的installed_app创建必要的数据库,我们也可以使用\dt查看新建的数据库。

二、创建模型

现在我们开始定义模型,也就是数据库的输出

在这个投票模型中有两个模型:询问和选择。

询问中是问题和数据展示。

选择有两部分,选择的文字描述和计票器。

首先编辑polls/models.py

from django.db import models


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

CharField和DateTimeField定义了这个字段的数据类型,CharField必须定义长度,投票的默认计数为0,ForeignKey定义了问题和选择一一相关,数据库之间的关系可以是多对一、多对多和一对一。

三、激活模型

这一小段模型代码为Django提供了大量信息。有了它,Django能够:


为此应用程序创建数据库架构(Create TABLE语句)。

创建用于访问问题和选择这两个对象的Python数据库访问API。


但首先我们需要告诉我们的项目,投票程序已经安装。

另外Django应用程序是即插即用型的:你可以在多个项目中使用一个应用程序,你可以分发应用程序,因为它们不必绑定到给定的Django安装。

要将应用加入项目中,需要在INSTALLED_APPS中设置这个应用,这个应用在polls/apps.py中定义了类PollsConfig,所以入口名称为'polls.apps.PollsConfig'

mysite/settings.py的INSTALLED_APPS添加设置如下:

INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

包含该应用后,运行指令:

python manage.py makemigrations polls

可以看到结果:

Migrations for 'polls':
  polls/migrations/0001_initial.py
    - Create model Question
    - Create model Choice

接下来看可以运行什么sql:

python manage.py sqlmigrate polls 0001
BEGIN;
--
-- Create model Question
--
CREATE TABLE "polls_question" ("id" bigserial NOT NULL PRIMARY KEY, "question_text" varchar(200) NOT NULL, "pub_date" timestamp with time zone NOT NULL);
--
-- Create model Choice
--
CREATE TABLE "polls_choice" ("id" bigserial NOT NULL PRIMARY KEY, "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL, "question_id" bigint NOT NULL);
ALTER TABLE "polls_choice" ADD CONSTRAINT "polls_choice_question_id_c5b4b260_fk_polls_question_id" FOREIGN KEY ("question_id") REFERENCES "polls_question" ("id") DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id");
COMMIT;

输出因数据库而异,这里根据模型展示了我们可以输入的sql命令

现在重新运行migrate,将模型表更新到数据库中。

python manage.py migrate
Applying polls.0001_initial... OK

python manage.py makemigrations指令可以用于建立迁移

python manage.py migrate指令迁移,这也是升级的方法。

四、使用API玩耍吧

现在,让我们使用Django提供的免费API:交互式Python shell。要调用Python shell,请使用以下命令:

python manage.py shell
>>> from polls.models import Choice, Question  # 导入刚才写的模型
# 目前系统里还没有question
>>> Question.objects.all()
<QuerySet []>
#现在要创建一个question
# 使用timezone.now()而不表示datetime.datetime.now() 来设置时间更好.
>>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now())

# 要将对象保存到数据库中必须使用save()
>>> q.save()

# 现在我们拥有了第一条记录.
>>> q.id
1

# 通过模型可以访问里面的字段.
>>> q.question_text
"What's new?"
>>> q.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)

# 可以改变属性后用save()保存.
>>> q.question_text = "想干吗?"
>>> q.save()

# objects.all() 可以展示数据库中的所有值.
>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>]>

这里我们发现最后的结果不是那么直观,所以我们对question类重新进行修改。在polls/models.py中添加:

from django.db import models

class Question(models.Model):
    # ...
    def __str__(self):
        return self.question_text

class Choice(models.Model):
    # ...
    def __str__(self):
        return self.choice_text

加入__str__()方法很重要,不仅我们自己阅读方便,也方便在Django中自动生成。

>>> from polls.models import Choice, Question

# M确保 __str__() 工作.
>>> Question.objects.all()
<QuerySet [<Question: 此刻的想法是?>]>


# Django 提供了一系列操作数据的API
>>> Question.objects.filter(id=1)
<QuerySet [<Question: 此刻的想法是?>]>
>>> Question.objects.filter(question_text__startswith='此刻')
<QuerySet [<Question: 此刻的想法是?>]>

# 获取今年发布的问题
>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Question.objects.get(pub_date__year=current_year)
<Question: 此刻的想法是?>


# 访问一个不存在的ID
>>> Question.objects.get(id=2)
Traceback (most recent call last):
    ...
DoesNotExist: Question matching query does not exist.

# 访问主键是最常见的情况。
# 下面这种方法等同于 Question.objects.get(id=1).
>>> Question.objects.get(pk=1)
<Question: 此刻的想法是?>


# 确保自定义方法成功.
>>> q = Question.objects.get(pk=1)
>>> q.was_published_recently()
True

#现在我们添加问题选项
>>> q = Question.objects.get(pk=1)

# 展示当前选项
>>> q.choice_set.all()
<QuerySet []>

# 创建三种选项
>>> q.choice_set.create(choice_text='爱自己', votes=0)
<Choice: 爱自己>
>>> q.choice_set.create(choice_text='爱自然', votes=0)
<Choice: 爱自然>
>>> c = q.choice_set.create(choice_text='爱人类', votes=0)

# 选项自动和问题连接
>>> c.question
<Question: 此刻的想法是?>


# 所有选项
>>> q.choice_set.all()
<QuerySet [<Choice: 爱自己>, <Choice: 爱自然>, <Choice: 爱人类>]>

>>> q.choice_set.count()
3

#API会根据需要自动跟踪关系。

#使用双下划线分隔关系。

#这项技术可以达到你想要的任何深度;没有限制。

#查找发布日期在今年的任何问题的所有选项

#(重复使用我们在上面创建的'current_year'变量)
<QuerySet [<Choice: 爱自己>, <Choice: 爱自然>, <Choice: 爱人类>]>


# Let's delete one of the choices. Use delete() for that.
>>> c = q.choice_set.filter(choice_text__startswith='爱人')
>>> c.delete()

四、介绍Django后台

创建管理员

python manage.py createsuperuser
Username: admin
Email address: admin@example.com
Password: **********
Password (again): *********
Superuser created successfully.

打开开发者服务

 python manage.py runserver

现在可以在浏览器中输入登陆后台了http://127.0.0.1:8000/admin/

我们可以用LANGUAGE_CODE修改界面语言,中文是zh-hans

后台可以添加组和用户。

 五、后台加入应用

现在我们需要将刚才写的应用加入管理员界面中,打开polls/admin.py,添加:

from django.contrib import admin

from .models import Question

admin.site.register(Question)

刷新后台,获得我们的这个应用。

 我们也可以试着把choice也加进来。

界面化了就可以随意玩耍了。

第三章会介绍更多视图方面的知识。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值