Django教程03 模型(model)

晓林网 自建博客学习问题及解决办法 红字

数据库设置

做网站就不能离开数据库,除非你是做静态网站。django中可以很方便的跟数据库打交道。

我们常见的数据库有MySQL, oracle, postgresql, django自带的sqllite , 还有NOSQL类型的mongodb,在这里我们使用的是mysql

安装mysql

1

sudo easy_isntall mysql

安装完成后,在终端中输入命令登陆mysql:

1

mysql-u root-p

然后输入你安装mysql时候设置的密码,如果没有设置,直接回车就好了

我们需要为工程创建一个数据库, 数据库名字就叫blog好了:

1

mysql> create database blog default charset=utf8;

设置默认字符集为utf8,以便支持中文。不要忘了在命令最后加个分号,不然命令是无效的。

打开myblog/settings.py 文件,修改DATABASE项:

1

2

3

4

5

6

7

8

9

10DATABASES={

'default': {

'ENGINE':'django.db.backends.mysql',

'NAME':'blog',

'USER':'root',

'PASSWORD': '',

'HOST':'localhost',

'PORT':'3306',

}

}

这样就能让django支持mysql,之后django就能直接操作数据库了。

顺便把settings.py文件下面的 TIME_ZONE='UTC'  改为  TIME_ZONE = 'Asia/Shanghai'  这是修改时区,为了让系统时间跟当前中国的时间绑定。

Django Model

在mysql中创建表等需要写sql语句,但在django不需要,一切都已经封装好了。数据库中的表是跟django中的类对应的,表的字段就对应着类的属性

比如我们需要这么一张表,表名:�Person, 字段有name , age等  ,如果用sql语句创建需要这么写:

1

2

3

4

5CREATE TABLE Person

(

name varchar(50),

ageint

)

而在django中,我们需要创建Python类来实现

打开blog/Model.py 文件, 创建Person类

1

2

3

4

5

6

7

8fromdjango.dbimportmodels

classPerson(models.Model):

name=models.CharField('姓名', max_length=50)

age=models.IntegerField('年龄', blank=True)

def__unicode__(self):

returnself.name

可以看到,我们创建了2个属性,也就是数据库表中的2个字段  name 的中文标识是 '姓名',最大长度是50个字符。第二个字段的 blank=True是表示这个字段可以为空

每个类都继承自model.Model.注意__unicode__ ,这个的是用来说明对象Person的表达式,告诉django用这个字段来表达自己。这个是在后台管理中的显示用的,在后面的教程中会讲到

以上是举得例子,那我们这个blog如何建表呢:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26# -*- coding: utf-8 -*-

fromdjango.dbimportmodels

# Create your models here.

classTag(models.Model):

tag_name=models.CharField('标签', max_length=50)

tag_cn_name=models.CharField('中文名字', max_length=50, blank=True)

def__unicode__(self):

returnself.tag_name

classArticle(models.Model):

title=models.CharField('标题', max_length=100)

tag=models.ManyToManyField(Tag, max_length=50, blank=True)

date_time=models.DateTimeField('日期', auto_now_add=True)

content=models.TextField('内容', blank=True, null=True)

def__unicode__(self):

returnself.title

classMeta:

verbose_name='文章'

verbose_name_plural='文章'

ordering=['-date_time']

verbose_name 属性也是为了在后台管理中显示用的, ordering是排序用的,['-date_time']就表示按时间倒序

ManyToManyField 是表示这是一个多对多的字段。对应的是Tag表

问题1: Error loading MySQLdb module: No module named MySQLdb

解决办法:

sudo apt-get install python-MySQLdb

问题2:SyntaxError: Non-ASCII character '\xe6' in file /home/jhy/myblog/blog/models.py on line 7, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

解决办法:from __future__ import unicode_literals

# encoding: utf-8 添加这句

from django.db import models

同步数据库

blog应用的所有类都已经写好了,怎么让mysql开始创建表呢。

打开终端,首先输入:

1

python manage.py  makemigrations

输出:

1

2

3

4

5Migrationsfor'blog':

0001_initial.py:

-Create model Article

-Create model Tag

-Add field tag to article

再输入命令:

1

python manage.py migrate

输出:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21perations to perform:

Synchronize unmigrated apps: staticfiles, blog, messages

Applyallmigrations: admin, contenttypes, auth, sessions

Synchronizing apps without migrations:

Creating tables...

Creating table blog_tag

Creating table blog_article

Running deferred SQL...

Installing custom SQL...

Running migrations:

Rendering model states... DONE

Applying contenttypes.0001_initial... OK

Applying auth.0001_initial... OK

Applying admin.0001_initial... 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 sessions.0001_initial... OK

表创建完后,系统会接着提示你是否要创建超级用户,这个用户是为了登陆后台管理用的,�你可以自己输入一个超级用户的账号,密码你可以自己输入,然后再随便输入一个邮箱地址就行了。如果在这个步骤你忘了创建,也可以通过命令单独创建超级用户:

1

2

3

4

5

6^CbxldeMac:myblog bxl$ python manage.py createsuperuser

Username (leave blank to use'bxl'): admin

Email address: [email protected]

Password:

Password (again):

Superuser created successfully.

注意Password后面是空的,因为在linux系统下输入密码是看不到的

在blog/admin.py中注册这两个表,如果不注册,在后台管理页面中是看不到这2个表的:

1

2

3

4

5

6

7fromdjango.contribimportadmin

fromblog.modelsimportTag, Article

# Register your models here.

admin.site.register(Tag)

admin.site.register(Article)

代码部分就做完了,在浏览器中输入 127.0.0.1:8000/admin  ,会出现登录界面:

Django教程03 模型(model)_第1张图片

输入你刚才创建的账号和密码后如果出现下面的界面,就表示你的表创建成功了:

Django教程03 模型(model)_第2张图片

也可登录mysql中查看表是否创建成功,打开终端,输入:

1

mysql-u root-p

使用数据库blog:

1

2mysql> use blog;

Database changed

查看数据库中所有的表

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19mysql> show tables;

+----------------------------+

| Tables_in_blog1            |

+----------------------------+

| auth_group                 |

| auth_group_permissions     |

| auth_permission            |

| auth_user                  |

| auth_user_groups           |

| auth_user_user_permissions |

| blog_article               |

| blog_article_tag           |

| blog_tag                   |

| django_admin_log           |

| django_content_type        |

| django_migrations          |

| django_session             |

+----------------------------+

13rowsinset(0.00sec)

可以看到,两个表Tag, Article已经创建成功了.

系统会自动在表名前面加数据库的名字blog,合起来作为表名。

Django Shell

我们可以直接通过django的交互方式来对数据库进行操作,输入:

1

python manage.py shell

1

2

3

4

5Python2.7.5(default, Mar92014,22:15:05)

[GCC4.2.1Compatible Apple LLVM5.0(clang-500.0.68)] on darwin

Type"help","copyright","credits"or"license"formore information.

(InteractiveConsole)

>>>

跟python的交互方式很像

1

2

3

4

5

6

7

8

9

10>>>fromblog.modelsimportTag

>>> Tag.objects.all()#查找Tag表中所有的数据

[, ]

>>> first=Tag.objects.get(id=1)#查找Tag表中id=1的数据

>>> first.tag_name#显示这条数据的tag_name信息

u'News'

>>> first.tag_cn_name#显示这条数据的tag_cn_name信息

u'\u65b0\u95fb'

>>> Tag.objects.create(tag_name='python', tag_cn_name='python')#插入一笔数据

当然,你也可以在mysql的操作台下通过sql语句来操作

打开终端,

你可能感兴趣的:(Django教程03 模型(model))