上一节我们简单创建了一个工程,并在浏览器输出了Hello World!
本节我们将继续进一步挖掘django的高级特性
- 链接mysql数据库
- 通过django自带的强大的model模块生成和使用数据库
- 玩玩django的admin功能
步骤一:如果要连接Mysql数据库需要安装一个驱动程序,在python中叫MYSQL-python模块MySQLdb
我按照网上的安装方法没有安装成功,会报很多错误,我的另外一篇文章有解决方案:
http://mp.blog.csdn.net/postedit/79256766
首先需要在本地的mysql数据库中创建一个database:
create database mysite;
需要在我的工程下的settings.py中配置本地mysql的数据源
DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mysite',
'USER': 'root',
'PASSWORD': '123123',
'HOST': '127.0.0.1', # 默认
'PORT': '3306', # 默认
}
}
然后执行命令
λ 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 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 sessions.0001_initial... OK
指令运行完后,mysql数据库中会自动创建一些django自带的表
这些数据库表都是django自动创建的,就是通过执行了
$ python manage.py migrate
为何会创建这些数据库表?
是因为在mysite/settings.py中,已经预装了很多APP了,也就是应用程序,这些在Django被实例化的时候(我理解的是程序运行的时候)被激活,那么这些模块要被使用,首先得保证数据库表的存在,所以Django先是创建了他们
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
migrate指令非常强大,可以在网上查到,再此不做多解释
步骤二:上面是链接并自动创建了一些数据库表,那么自己的数据库表如何创建呢?
在我们自己创建的app polls中,有个py文件是models.py,这就是我们创建model的地方,创建两个model,分别是Question 和Choice,如下:
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)
这两个model都是继承自models.Model ,并且Question和Choice是1对多的关系,django是支持数据库的one to one,more to more,one to more的,其他语法不解释。
第三步:激活模型
首先需要将我们的polls文件放置到INSTALLED_APPS中,如下:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'polls.apps.PollsConfig',
]
django这样就知道我们将polls app包含进来了,然后执行下面指令将polls也做到migrate里去
$ python manage.py makemigrations polls
Migrations for 'polls': polls\migrations\0001_initial.py - Create model Choice - Create model Question - Add field question to choice执行完后在migrate.py中会出现如下的一个0001_initial.py,里面自动生成我们创建的两个model,代码如下:
0001_initial.py:
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
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)),
],
),
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.AddField(
model_name='choice',
name='question',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='polls.Question'),
),
]
大致的意思就是创建这两个model,并对外键有一个说明
然后运行另外一个指令,这个指令执行会生成对应的SQL语句,用于创建新的数据库表:
λ python manage.py sqlmigrate polls 0001
BEGIN;
--
-- Create model Choice
--
CREATE TABLE `polls_choice` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `choice_text` varchar(200) NOT NULL, `votes` integer NOT NULL);
--
-- Create model Question
--
CREATE TABLE `polls_question` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `question_text` varchar(200) NOT NULL, `pub_date` datetime(6) NOT NULL);
--
-- Add field question to choice
--
ALTER TABLE `polls_choice` ADD COLUMN `question_id` integer 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`);
COMMIT;
再次执行一个指令,就会在数据库表生成Question和Choice
λ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
Applying polls.0001_initial... OK
回到数据库中,刷新数据表如下:
可以使用python shell指令对刚创建的两个表进行操作,如下是摘自官网的指令:
>>> from polls.models import Question, Choice # Import the model classes we just wrote. # No questions are in the system yet. >>> Question.objects.all() <QuerySet []> # Create a new Question. # Support for time zones is enabled in the default settings file, so # Django expects a datetime with tzinfo for pub_date. Use timezone.now() # instead of datetime.datetime.now() and it will do the right thing. >>> from django.utils import timezone >>> q = Question(question_text="What's new?", pub_date=timezone.now()) # Save the object into the database. You have to call save() explicitly. >>> q.save() # Now it has an ID. >>> q.id 1 # Access model field values via Python attributes. >>> q.question_text "What's new?" >>> q.pub_date datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>) # Change values by changing the attributes, then calling save(). >>> q.question_text = "What's up?" >>> q.save() # objects.all() displays all the questions in the database. >>> Question.objects.all() <QuerySet [<Question: Question object (1)>]>
上述指令执行后可以看到,我们在执行Qusetion.objects.all()会显示
<Question: Question object (1)>,这好比类似于java中的domain对象,没有序列化实现toString,打印这个对象会显示一串看不懂的乱码,在这我们可以通过polls/models.py添加—__str__()
添加后的代码:
from django.db import models
from django.utils import timezone
import datetime
# Create your models here.
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
这样数据库就设置好了
第四步:django的admin介绍
首先我们先创建一个admin的user
指令如下:
λ python manage.py createsuperuser
Username (leave blank to use 'hanyouchuan'): admin
Email address: admin
Email address: hanyouchuan@163.com
Password:
Password (again):
Superuser created successfully.
创建好后,就可以登录了
先启动服务:
$ python manage.py runserver
在浏览器输入127.0.0.1:8000/admin
输入username & password
可以看到django自带身份验证的界面还是很酷的,如果我们要想将我们的polls下的Question或者Choice添加到里面,怎么做呢?
在polls.admin.py添加如下代码:
from django.contrib import admin from .models import Question admin.site.register(Question)这句话的意思是告诉admin将Question注册到site里面
可见通过直接注册,我们就拥有了可视化的操作Question的能力,并且还有很多功能,是不是很酷
英语不好,完全凭感觉,未完待续……