django实战2

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 migrateOperations to perform:  Apply all migrations: admin, auth, contenttypes, sessionsRunning 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 modelsclass 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 pollsMigrations 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:48from django.db import migrations, modelsimport django.db.models.deletionclass 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 0001BEGIN;---- 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 DEFERRED);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 shellPython 3.8.6 (tags/v3.8.6:db45529, Sep 23 2020, 15:52:53) [MSC v.1927 64 bit (AMD64)] on win32Type "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.id1>>> q = Question(question_text="Who are you?", pub_date=timezone.now())>>> q.save()##插入数据 what are you?并且保存>>> q.id2>>> q = Question(question_text="请问你的学校是哪里?", pub_date=timezone.now())>>> q.save() ###插入数据 请问你的学校是哪里? 并且保存>>> q.id3>>> q.question_text #查看字段内容'请问你的学校是哪里?'>>> Question.objects.all() #再次查看 有3条记录<QuerySet [<Question: Question object (1)>, <Question: Question object (2)>, <Question: Question object (3)>]>>>>

修改一下models.py

import datetimefrom django.db import modelsfrom django.utils import timezoneclass 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 createsuperuserUsername (leave blank to use 'dev'): adminEmail address: admin@admin.comPassword:Password (again):Bypass password validation and create user anyway? [y/N]: ySuperuser created successfully.

启动服务 python manage.py runserver;进入127.0.0.1:8000/admin

进入界面输入admin/admin123

可以看到界面中没有polls的入口,需要修改一下文件

修改文件为admin.py 

# Register your models here.from .models import Questionadmin.site.register(Question)

这时候页面刷新一次,在进入就可以发现

 

保存–保存更改并返回此类型对象的更改列表页。

保存并继续编辑–保存更改并重新加载此对象的管理页。

保存并添加另一个–保存更改并加载此类型对象的新空白窗体。

删除–显示删除确认页。

 

 

总结

今天学习django的插入数据库sqlite的基本技巧,请练习一下。

 

 

 

 

--END--


 点击屏末  | 

 

专注于AI,开发、测试技术研究


关注  智慧rdda大成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值