django学习入门二:链接数据库、创建数据库model、学习django的admin模块

     上一节我们简单创建了一个工程,并在浏览器输出了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的能力,并且还有很多功能,是不是很酷


英语不好,完全凭感觉,未完待续……


















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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值