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: admin@123.com

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  ,会出现登录界面:

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

也可登录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语句来操作

打开终端,

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容