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
10
DATABASES  =  {
     '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
5
CREATE TABLE Person
(
name varchar( 50 ),
age  int
)

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

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

1
2
3
4
5
6
7
8
from  django.db  import  models
 
class  Person(models.Model):
     name  =  models.CharField( '姓名' , max_length = 50 )
     age  =  models.IntegerField( '年龄' , blank = True )
 
     def  __unicode__( self ):
         return  self .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 -*-
from  django.db  import  models
 
# Create your models here.
 
class  Tag(models.Model):
     tag_name  =  models.CharField( '标签' , max_length = 50 )
     tag_cn_name  =  models.CharField( '中文名字' , max_length = 50 , blank = True )
 
     def  __unicode__( self ):
         return  self .tag_name
 
 
class  Article(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 ):
         return  self .title
 
     class  Meta:
         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
5
Migrations  for  '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
21
perations to perform:
   Synchronize unmigrated apps: staticfiles, blog, messages
   Apply  all  migrations: 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
7
from  django.contrib  import  admin
from  blog.models  import  Tag, Article
 
# Register your models here.
 
admin.site.register(Tag)
admin.site.register(Article)

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

4-2.png

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

4-1.png

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

1
mysql  - u root  - p

使用数据库blog:

1
2
mysql> use blog;
Database changed

查看数据库中所有的表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> 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             |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
13  rows  in  set  ( 0.00  sec)

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

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

Django Shell

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

1
python manage.py shell
1
2
3
4
5
Python  2.7 . 5  (default, Mar   9  2014 22 : 15 : 05
[GCC  4.2 . 1  Compatible Apple LLVM  5.0  (clang - 500.0 . 68 )] on darwin
Type  "help" "copyright" "credits"  or  "license"  for  more information.
(InteractiveConsole)
>>>

跟python的交互方式很像

1
2
3
4
5
6
7
8
9
10
>>>  from  blog.models  import  Tag
>>> Tag.objects. all ()   #查找Tag表中所有的数据
[<Tag: News>, <Tag: Tech>]
>>> 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' )   #插入一笔数据
<Tag: Tag  object >

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

打开终端,

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值