数据建模:以Mysql为例
1.Django 的 M(Model)T(Template)V(View)开发模式:
M:数据存取层,处理与数据相关的存取、正确性确认、数据之间的逻辑、行为定义等所有的事务
T:表现层,处理与表现相关的决策:如何在页面和其他类型中进行显示
V:业务逻辑层,包含了存取模型,以及调用恰当模型的相关逻辑
在 Django 对 MVC 的诠释中,视图用来描述要展现给用户的数据;不是数据看起来 怎么样 ,而是要呈现 哪些 数据。相比之下,Ruby on Rails 及一些同类框架提倡控制器负责决定向用户展现哪些数据,而视图则仅决定 如何 展现数据,而不是展现 哪些 数据。
2.配置数据库,在settings中配置数据库。
settings.py codes:
3.利用命令行检查链接:
>>>python manage.py shell
4.0初始化App:
>>>python manage.py startapp books
4.1实现model:用python代码来描述App逻辑:
models.py codes:
unicode方法实现对象的字符串显示
4.2将App添加到站点:
settings.py codes:
4.3修改/添加一个App:
>>>python manage.py makemigrations polls
将会给出修改的内容
4.5查看进行的第N步行为N~[1,9999]
>>>python manage.py sqlmigrate books 0001
4.6检查是否有错:
>>>python manage.py check
4.7实施修改:
>>>python manage.py migrate
python 将根据models中的逻辑在数据库中创建表,每张表会自动生成一个自增的id主键
5.利用shell来认识models:
>>>python manage.py shell进入shell
1.Django 的 M(Model)T(Template)V(View)开发模式:
M:数据存取层,处理与数据相关的存取、正确性确认、数据之间的逻辑、行为定义等所有的事务
T:表现层,处理与表现相关的决策:如何在页面和其他类型中进行显示
V:业务逻辑层,包含了存取模型,以及调用恰当模型的相关逻辑
在 Django 对 MVC 的诠释中,视图用来描述要展现给用户的数据;不是数据看起来 怎么样 ,而是要呈现 哪些 数据。相比之下,Ruby on Rails 及一些同类框架提倡控制器负责决定向用户展现哪些数据,而视图则仅决定 如何 展现数据,而不是展现 哪些 数据。
2.配置数据库,在settings中配置数据库。
settings.py codes:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test', #the name of used database
'USER': 'root',
'PASSWORD': 'root',
'HOST': '', #'' means localhost(127.0.0.1)
'PORT': '3306', #'' means default
}
}
3.利用命令行检查链接:
>>>python manage.py shell
In [1]: from django.db import connection as conn
In [2]: cursor = conn.cursor()
In [3]: cursor
Out[3]: <django.db.backends.utils.CursorDebugWrapper at 0x3dba390>
4.0初始化App:
>>>python manage.py startapp books
books
│ admin.py
│ models.py
│ tests.py
│ views.py
│ __init__.py
│
└─migrations
__init__.py
4.1实现model:用python代码来描述App逻辑:
models.py codes:
from django.db import models
# Create your models here.
class Publisher(models.Model):
def __unicode__(self):
return self.name
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.CharField(max_length=30)
class Author(models.Model):
def __unicode__(self):
return first.name+' '+last_name
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=50)
email = models.EmailField()
class Book(models.Model):
def __unicode__(self):
return self.title
title = models.CharField(max_length=1000)
authors = models.ManyToManyField(Author)
publishers = models.ForeignKey(Publisher)
publication_date = models.DateField()
unicode方法实现对象的字符串显示
4.2将App添加到站点:
settings.py codes:
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'books',#添加这一行
)
4.3修改/添加一个App:
>>>python manage.py makemigrations polls
将会给出修改的内容
4.5查看进行的第N步行为N~[1,9999]
>>>python manage.py sqlmigrate books 0001
BEGIN;
CREATE TABLE `books_author` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `
first_name` varchar(30) NOT NULL, `last_name` varchar(50) NOT NULL, `email` varc
har(254) NOT NULL);
CREATE TABLE `books_book` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `ti
tle` varchar(1000) NOT NULL, `publication_date` date NOT NULL);
CREATE TABLE `books_book_authors` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY
KEY, `book_id` integer NOT NULL, `author_id` integer NOT NULL, UNIQUE (`book_id`
, `author_id`));
CREATE TABLE `books_publisher` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY
, `name` varchar(30) NOT NULL, `address` varchar(50) NOT NULL, `city` varchar(60
) NOT NULL, `state_province` varchar(30) NOT NULL, `country` varchar(50) NOT NUL
L, `website` varchar(200) NOT NULL);
ALTER TABLE `books_book` ADD COLUMN `publishers_id` integer NOT NULL;
ALTER TABLE `books_book` ALTER COLUMN `publishers_id` DROP DEFAULT;
ALTER TABLE `books_book_authors` ADD CONSTRAINT `books_book_authors_book_id_30c6
61c_fk_books_book_id` FOREIGN KEY (`book_id`) REFERENCES `books_book` (`id`);
ALTER TABLE `books_book_authors` ADD CONSTRAINT `books_book_authors_author_id_40
7dfb10_fk_books_author_id` FOREIGN KEY (`author_id`) REFERENCES `books_author` (
`id`);
CREATE INDEX `books_book_authors_0a4572cc` ON `books_book_authors` (`book_id`);
CREATE INDEX `books_book_authors_4f331e2f` ON `books_book_authors` (`author_id`)
;
CREATE INDEX `books_book_3bcd2047` ON `books_book` (`publishers_id`);
ALTER TABLE `books_book` ADD CONSTRAINT `books_book_publishers_id_5fd67839_fk_bo
oks_publisher_id` FOREIGN KEY (`publishers_id`) REFERENCES `books_publisher` (`i
d`);
COMMIT;
4.6检查是否有错:
>>>python manage.py check
System check identified no issues (0 silenced).
4.7实施修改:
>>>python manage.py migrate
python 将根据models中的逻辑在数据库中创建表,每张表会自动生成一个自增的id主键
5.利用shell来认识models:
>>>python manage.py shell进入shell
In [1]: from books.models import Publisher
In [2]: Publisher.objects.all()
Out[2]: [<Publisher: Apress>]
In [5]: p = Publisher(name='Bpress',address='Other Address',city='b city',state_
province='CB',country='U.K')
In [6]: p
Out[6]: <Publisher: Bpress>
In [7]: Publisher.objects.all()
Out[7]: [<Publisher: Apress>]
In [8]: p.save()
In [9]: Publisher.objects.all()
Out[9]: [<Publisher: Apress>, <Publisher: Bpress>]
In [10]: Publisher.objects.order_by("name")#-name就是逆序
Out[10]: [<Publisher: Apress>, <Publisher: Bpress>]
In [11]: p = Publisher.objects.get(name='Apress')
In [12]: p.delete()
In [13]: Publisher.objects.all()
Out[13]: [<Publisher: Bpress>]
In [15]: Publisher.objects.filter(pk=2)
Out[15]: [<Publisher: Bpress>]
In [20]: Publisher.objects.filter(name__contains='p')
Out[20]: [<Publisher: Bpress>]
In [21]: Publisher.objects.filter(name__startswith='B')
Out[21]: [<Publisher: Bpress>]
In [22]: Publisher.objects.count()
Out[22]: 1
In [27]: p = Publisher.objects.all()[0]
In [28]: p.pk
Out[28]: 2L
In [37]: Publisher.objects.all().delete()
In [38]: Publisher.objects.all()
Out[38]: []