Django使用数据库
默认情况下,配置使用SQLite。如果您是数据库新手,或者您只是对尝试Django感兴趣,那么这是最简单的选择。SQLite包含在Python中,因此您不需要安装任何其他东西来支持您的数据库。然而,当您开始第一个真正的项目时,您可能希望使用一个更具可伸缩性的数据库,如PostgreSQL,以避免数据库切换带来的麻烦。
如果要使用其他数据库,请安装相应的数据库绑定,并更改数据库“default”项中的以下键以匹配数据库连接设置:
-
ENGINE
– Either'django.db.backends.sqlite3'
,'django.db.backends.postgresql'
,'django.db.backends.mysql'
, or'django.db.backends.oracle'
. Other backends are also available. -
NAME
– The name of your database. If you’re using SQLite, the database will be a file on your computer; in that case,NAME
should be the full absolute path, including filename, of that file. The default value,BASE_DIR / 'db.sqlite3'
, will store the file in your project directory.
另外,请注意文件顶部的“已安装的应用程序”设置。保存在此Django实例中激活的所有Django应用程序的名称。应用程序可以在多个项目中使用,您可以打包和分发它们,以供其他人在其项目中使用。
-
django.contrib.admin
– The admin site. You’ll use it shortly. -
django.contrib.auth
– An authentication system. -
django.contrib.contenttypes
– A framework for content types. -
django.contrib.sessions
– A session framework. -
django.contrib.messages
– A messaging framework. -
django.contrib.staticfiles
– A framework for managing static files.
但是,其中一些应用程序至少使用一个数据库表,因此我们需要先在数据库中创建表,然后才能使用它们。为此,请运行以下命令:
$ python manage.py migrate
(venv) D:\t\mysite>python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying sessions.0001_initial... OK
创建一个models
在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)
1行:定义django.db 导入到models
2行:定义一个Questions类,里面有问题字段文本类型和一个发布问题时间类型2个字段
5行:定义一个选择类型,选择问题和选择的文本描述,实际就是回答问题
在这里,每个模型都由一个子类表示django.db.Models.model。每个模型都有许多类变量,每个类变量表示模型中的一个数据库字段。
每个字段都由一个字段类的实例表示,例如CharField表示字符字段,datetimes表示datetimes。这会告诉Django每个字段包含什么类型的数据。
每个字段实例的名称(例如question 为 text或pub为 date)是该字段的名称,采用机器友好的格式。您将在Python代码中使用这个值,并且您的数据库将使用它作为列名。
可以对字段使用可选的第一个位置参数来指定可读的名称。这在Django的几个内省部分中使用,它兼作文档。如果没有提供此字段,Django将使用机器可读的名称。在本例中,我们只为问题.发布日期. 对于此模型中的所有其他字段,字段的机器可读名称将足以作为其人类可读名称。
某些字段类具有必需的参数。例如,CharField要求您给它一个max 长度。这不仅用于数据库模式,而且用于验证,我们很快就会看到。
字段也可以有各种可选参数;在本例中,我们将投票的默认值设置为0。
最后,请注意,使用ForeignKey定义了一个关系。这告诉Django每个选择都与一个问题有关。Django支持所有常见的数据库关系:多对一、多对多和一对一。
激活模型
为此应用程序创建数据库架构(Create TABLE语句)。
创建一个Python数据库访问API,用于访问Question和Choice对象。
mysite/setting.py 增加下面内容
INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
现在Django知道要包含polls应用程序。让我们运行另一个命令:
>python manage.py makemigrations polls
Migrations for 'polls':
polls\migrations\0001_initial.py
- Create model Question
- Create model Choice
建立了2个数据库table
通过运行makemigrations,您告诉Django您已经对您的模型做了一些更改(在本例中,您已经做了一些新的更改),并且希望将更改存储为迁移。
迁移是Django存储对模型(以及数据库模式)的更改的方式—它们是磁盘上的文件。如果愿意,您可以阅读新模型的迁移;它是polls/migrations/
0001_initial.py
. 别担心,你不需要每次Django做一个的时候都读它们,但是它们被设计成可以人工编辑的,以防你想手动调整Django如何改变事情。
0001_initial.py是代码自动生成的,内容如下:如果想了解它,可以查看一下代码内容;这个文件基本都不会去修改它;
0001_initial.py
# Generated by Django 3.1.7 on 2021-03-03 01:48
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [ ]
operations = [ migrations.CreateModel( name='Question', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('question_text', models.CharField(max_length=200)), ('pub_date', models.DateTimeField(verbose_name='date published')), ],
),
migrations.CreateModel(
name='Choice',
fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('choice_text', models.CharField(max_length=200)), ('votes', models.IntegerField(default=0)), ('question', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='polls.question')), ],
),
]
有一个命令可以为您运行迁移并自动管理数据库模式—这就是migrate,我们稍后将讨论它—但首先,让我们看看迁移将运行什么SQL。sqlmigrate命令接受迁移名称并返回它们的SQL:
python manage.py sqlmigrate polls 0001
正式创建数据表,类似生成sql语句;
python manage.py sqlmigrate polls 0001
BEGIN;
--
-- Create model Question
--
CREATE TABLE "polls_question" ("id" integer NOT NULL
PRIMARY KEY AUTOINCREMENT,
"question_text" varchar(200) NOT NULL,
"pub_date" datetime NOT NULL);
--
-- Create model Choice
--
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 DEFERRE
D);
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id");
COMMIT;
注意以下几点:
确切的输出将因您使用的数据库而异。上面的例子是为PostgreSQL生成的。
表名是通过组合应用程序(polls)的名称和模型的小写名称(question和choice)自动生成的。(可以重写此行为。)
主键(ID)将自动添加。(您也可以覆盖它。)
按照惯例,Django在外键字段名后面附加“id”。(是的,您也可以覆盖它。)
外键关系由外键约束显式表示。不要担心可延迟部分;它告诉PostgreSQL在事务结束之前不要强制执行外键。
它是根据您使用的数据库定制的,因此自动处理特定于数据库的字段类型,如auto increment(MySQL)、serial(PostgreSQL)或integer primary key autoincrement(SQLite)。引用字段名也是一样的,例如,使用双引号或单引号。
sqlmigrate命令实际上并不在数据库上运行迁移,而是将其打印到屏幕上,以便您可以看到SQLDjango认为需要什么。它有助于检查Django将要做什么,或者您是否有需要SQL脚本进行更改的数据库管理员。
如果您感兴趣,还可以运行python manage.py check;这将检查项目中的任何问题,而不进行迁移或接触数据库。
python manage.py migrate
python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
Applying polls.0001_initial... OK
-
如果有修改文件 (in
models.py
). 需要执行下面这2句命令 -
Run
python manage.py makemigrations
to create migrations for those changes -
Run
python manage.py migrate
to apply those changes to the database.
使用API
python manage.py shell
python manage.py shell
Python 3.8.6 (tags/v3.8.6:db45529, Sep 23 2020, 15:52:53) [MSC v.1927 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from polls.models import Choice, Question
>>> Question.objects.all() #查询所有数据select * from question;
<QuerySet []>
>>> from django.utils import timezone
>>> q = Question(question_text="What time is it?", pub_date=timezone.now())
>>> q.save() ##插入数据 what time is it?并且保存
>>> q.id
1
>>> q = Question(question_text="Who are you?", pub_date=timezone.now())
>>> q.save()##插入数据 what are you?并且保存
>>> q.id
2
>>> q = Question(question_text="请问你的学校是哪里?", pub_date=timezone.now())
>>> q.save() ###插入数据 请问你的学校是哪里? 并且保存
>>> q.id
3
>>> q.question_text #查看字段内容
'请问你的学校是哪里?'
>>> Question.objects.all() #再次查看 有3条记录
<QuerySet [<Question: Question object (1)>, <Question: Question object (2)>, <Question: Question object (3)>]>
>>>
修改一下models.py
import datetime
from django.db import models
from django.utils import timezone
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text
建立一个admin 超级用户
python manage.py createsuperuser
Username (leave blank to use 'dev'): admin
Email address: admin@admin.com
Password:
Password (again):
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.
启动服务 python manage.py runserver;进入127.0.0.1:8000/admin
进入界面输入admin/admin123
可以看到界面中没有polls的入口,需要修改一下文件
修改文件为admin.py
# Register your models here.
from .models import Question
admin.site.register(Question)
这时候页面刷新一次,在进入就可以发现
保存–保存更改并返回此类型对象的更改列表页。
保存并继续编辑–保存更改并重新加载此对象的管理页。
保存并添加另一个–保存更改并加载此类型对象的新空白窗体。
删除–显示删除确认页。
总结
今天学习django的插入数据库sqlite的基本技巧,请练习一下。
--END--
点击屏末 | 阅读原文 |
专注于AI,开发、测试技术研究
关注 智慧rdda大成