Django教程03 模型(model)

来源:互联网 发布:用什么软件看禁播电影 编辑:程序博客网 时间:2024/05/01 23:38

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

数据库设置

做网站就不能离开数据库,除非你是做静态网站。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 201422: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
原创粉丝点击