1. Django安装

[root@HappyLau ~]# pip install django==1.8.

2. 创建项目

[root@HappyLau html]# django-admin startproject demo

查看项目的结构:
[root@HappyLau html]# tree demo/
demo/
├── demo
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── settings.py
│   ├── settings.pyc
│   ├── urls.py
│   └── wsgi.py
└── manage.py 1 directory, 7 files demo目录文件说明:
__init__.py 代表是一个包
settings.py 配置文件,环境设定
urls.py urls地址映射关系
wsgi.py wsgi.py设定,django是遵循WSGI协议的框架
启动django web服务器,运行python manage.py runserver,然后django会默认运行在本机的8000/tcp端口,然后可以通过浏览器访问。如下图:

如需要中文,可以修改django支持中文环境,编辑settings.py文件,设定内容如下:

LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'

3. 配置数据库

  Django默认采用sqllite3数据库作为数据持久存储,实际工作中一般使用MySQL作为结构化数据存储,在python2中使用python-MySQL作为python和MySQL数据库交互的API,而python3中使用pymysql,且不支持python-MySQL,所以以pymysql作为主体使用,需要在项目/应用的__init__.py文件中定义使用如下:

[root@HappyLau demo]# cat demo/__init__.py
import pymysql
pymysql.install_as_MySQLdb()

1. 安装MySQL数据库和pymysql模块

root@HappyLau demo]# yum install mariadb mariadb-server python2-PyMySQL -y

修改MariaDB的默认字符集,修改server端
[root@HappyLau demo]# vim /etc/my.cnf.d/server.cnf
[server]
character-set-server=utf8 # this is only for the mysqld standalone daemon
[mysqld]
character-set-server=utf8 修改client端:
[root@HappyLau demo]# vim /etc/my.cnf.d/client.cnf
[client]
default-character-set=utf8 启动数据库:
[root@HappyLau demo]# systemctl restart mariadb
[root@HappyLau demo]# systemctl enable mariadb

2. 数据库环境准备

MariaDB [(none)]> create database book;
Query OK, 1 row affected (0.01 sec)
MariaDB [(none)]>
MariaDB [(none)]> grant all privileges on book.* to 'bookadmin'@'localhost' identified by 'bookpassword';
Query OK, 0 rows affected (0.04 sec) MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.02 sec)

3. 配置Django数据库连接,修改settings.py文件,找到DATABASES行,修改内容如下:

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': 'localhost',
'PORT': 3306,
'USER': 'bookadmin',
'PASSWORD': 'bookpassword',
'NAME': 'book'
}
}

4.  创建和管理应用

1. 创建应用

[root@HappyLau demo]# django-admin startapp book

查看应用目录结构:
[root@HappyLau demo]# tree book/
book/
├── admin.py
├── __init__.py
├── migrations
│   └── __init__.py
├── models.py
├── tests.py
└── views.py 1 directory, 6 files

2. 将应用注册到django中,修改项目的settings.py文件,找到INSTALLED_APPS行,将book应用添加到其中,如下:

INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'book'
)

4. 编写应用模型

1. 定义模型的类,在每个应用包目录下的models.py文件中定义,如book应用的的book/models.py文件,定义两个模型:书本和英雄模型,其中书本作为英雄的外键而存在,如果有多个应用则在各自的应用中定义模型即可,定义如下:

[root@HappyLau demo]# cat book/models.py
#_*_ coding:utf8 _*_ from django.db import models class Book(models.Model):
'''
@models.Model,定义Book数据库models类
'''
book_name = models.CharField(max_length=128)
author_name = models.CharField(max_length=128)
publish_date = models.DateTimeField() def __str__(self):
'''格式化输出'''
return self.book_name,self.author_name,self.publish_date class Hero(models.Model):
'''
@models.Model,定义超人Hero数据库models类
'''
hero_name = models.CharField(max_length=128)
hero_sex = models.BooleanField()
hero_content = models.CharField(max_length=1024)
hero_book = models.ForeignKey(Book) def __str__(self):
'''格式化输出'''
return self.hero_name,self.hero_sex,self.hero_content,self.hero_book

2. 生成模型所需的表

[root@HappyLau demo]# python manage.py  makemigrations
Migrations for 'book':
0001_initial.py:
- Create model Book
- Create model Hero
[root@HappyLau demo]# python manage.py migrate
Operations to perform:
  Synchronize unmigrated apps: staticfiles, messages
  Apply all migrations: admin, contenttypes, book, auth, sessions
Synchronizing apps without migrations:
  Creating tables...
    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 book.0001_initial... OK
  Applying sessions.0001_initial... OK

3. 查看模型的表格,执行migrate之后,在应用的migrations目录下生成创建SQL语句的文件,如下为目录的结构,并查看文件内容,如下:

[root@HappyLau demo]# tree
.
├── book
│   ├── admin.py
│   ├── admin.pyc
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── migrations
│   │   ├── 0001_initial.py #新增的创建SQL语句的文件
│   │   ├── 0001_initial.pyc
│   │   ├── __init__.py
│   │   └── __init__.pyc
│   ├── models.py
│   ├── models.pyc
│   ├── tests.py
│   └── views.py
├── demo
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── settings.py
│   ├── settings.pyc
│   ├── urls.py
│   └── wsgi.py
└── manage.py 查看 0001_initial.py文件内容,如下:
[root@HappyLau demo]# cat book/migrations/0001_initial.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals from django.db import models, migrations class Migration(migrations.Migration): dependencies = [
] operations = [
migrations.CreateModel(
name='Book',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('book_name', models.CharField(max_length=128)),
('author_name', models.CharField(max_length=128)),
('publish_date', models.DateTimeField()),
],
),
migrations.CreateModel(
name='Hero',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('hero_name', models.CharField(max_length=128)),
('hero_sex', models.BooleanField()),
('hero_content', models.CharField(max_length=1024)),
('hero_book', models.ForeignKey(to='book.Book')),
],
),
]

通过上面的文件可以发现,通过models类创建数据模型的时候会在数据库中自动生成id字段,该id字段是主键primary_key,且是自增auto_created。如下通过查看数据库的表结构,如下:

MariaDB [book]> show create table book_book ;
+-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| book_book | CREATE TABLE `book_book` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`book_name` varchar(128) NOT NULL,
`author_name` varchar(128) NOT NULL,
`publish_date` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec) MariaDB [book]> show create table book_hero ;+-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| book_hero | CREATE TABLE `book_hero` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`hero_name` varchar(128) NOT NULL,
`hero_sex` tinyint(1) NOT NULL,
`hero_content` varchar(1024) NOT NULL,
`hero_book_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `book_hero_hero_book_id_766a63d04ebcda8c_fk_book_book_id` (`hero_book_id`),
CONSTRAINT `book_hero_hero_book_id_766a63d04ebcda8c_fk_book_book_id` FOREIGN KEY (`hero_book_id`) REFERENCES `book_book` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

4. 使用django shell测试数据模型,django的manage.py提供一个shell工具和数据模型交互的接口,可以实现直接与数据库交互,如下:

[root@HappyLau demo]# python manage.py  shell
Python 2.7.5 (default, Aug 4 2017, 00:39:18)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
#插入数据(实际执行了INSERT语句)
>>> from book.models import Book
>>> from book.models import Hero
>>> b = Book()
>>> b.book_name = "天龙十八部"
>>> b.author = "金庸"
>>> b.publish_date = "2018-03-17"
>>> b.save() >>> b1 = Book()
>>> b1.book_name = "射雕英雄传"
>>> b1.author = "金庸"
>>> b1.publish_date = "2018-03-17"
>>> b1.save() 外键数据插入:
>>> h = Hero()
>>> h.hero_name = "乔峰"
>>> h.hero_sex = "男"
>>> h.hero_content = "乔峰是一个大英雄,拥有盖世武功,如降龙十八掌,擒龙手等。"
>>> h.hero_book = b
>>> b.save() >>> h1 = Hero()
>>> h1.hero_name = "郭靖"
>>> h1.hero_sex = "男"
>>> h1.hero_content = "郭靖是个傻大个,但武功高强,肯学,努力!"
>>> h1.hero_book = b1
>>> h1.save() 查询数据所有数据(实际执行了SELCT语句):
>>> Book.objects.all()
[<Book: 天龙十八部>, <Book: 射雕英雄传>]
>>> Hero.objects.all()
[<Hero: 郭靖>, <Hero: 乔峰>] 根据条件查询数据,如根据主键查询(pk是primary_key)
>>> Book.objects.get(pk=1)
<Book: 天龙十八部>
>>> Book.objects.get(book_name="射雕英雄传")
<Book: 射雕英雄传> 更新数据(实际是执行了UPDATE语句):
>>> book = Book.objects.get(pk=1)
>>> from datetime import datetime
>>> book.publish_date
datetime.datetime(2018, 3, 17, 0, 0, tzinfo=<UTC>)
>>> book.publish_date = datetime(year=1997,month=1,day=1)
>>> book.save()
/usr/lib64/python2.7/site-packages/django/db/models/fields/__init__.py:1474: RuntimeWarning: DateTimeField Book.publish_date received a naive datetime (1997-01-01 00:00:00) while time zone support is active.
RuntimeWarning) >>> book.publish_date
datetime.datetime(1997, 1, 1, 0, 0) 删除数据(实际执行了DELETE语句):
>>> hero = Hero.objects.get(hero_name='郭靖')
>>> hero.delete()
>>> Hero.objects.all()
[<Hero: 乔峰>]
>>> hero.save() 最后查看数据库中的内容:
MariaDB [book]> select * from book_book;
+----+-----------------+-------------+---------------------+
| id | book_name       | author_name | publish_date        |
+----+-----------------+-------------+---------------------+
|  1 | 天龙十八部      |             | 1997-01-01 00:00:00 |
|  2 | 射雕英雄传      |             | 2018-03-17 00:00:00 |
+----+-----------------+-------------+---------------------+
2 rows in set (0.00 sec) MariaDB [book]> select * from book_hero;
+----+-----------+----------+--------------------------------------------------------------------------------------+--------------+
| id | hero_name | hero_sex | hero_content                                                                         | hero_book_id |
+----+-----------+----------+--------------------------------------------------------------------------------------+--------------+
|  3 | 乔峰      |        1 | 乔峰是一个大英雄,拥有盖世武功,如降龙十八掌,擒龙手等。                             |            1 |
|  4 | 郭靖      |        1 | 郭靖是个傻大个,但武功高强,肯学,努力!                                              |            2 |
+----+-----------+----------+--------------------------------------------------------------------------------------+--------------+
2 rows in set (0.00 sec)

5.  后台数据管理

web应用中,通过web站点将数据展现给用户,这些所展示的数据最终存储在后台数据中,即需要通过一个后台管理来实现用户数据的添加/删除等操作,django默认提供了一个admin的管理后台,并提供了相关的用户管理机制,可以通过createsuperuser超级管理员账户,也可以将用户所属的应用添加到后台中管理,如下:

1. 创建管理用户,创建完管理用户之后可以通过访问http://localhost/admin页面访问,输入创建用户的用户名和密码,即可登陆。

[root@HappyLau demo]# python manage.py  createsuperuser
Username (leave blank to use 'root'): happylau
Email address: happylau@cnblogs.com
Password:
Password (again):
Superuser created successfully.

2. 注册应用到后台,即通过刚所创建的两个模型:Book模型和Hero模型通过后台的方式管理,由于设计到中文输入,所以需要通过sys.setdefaultencoding('utf8')的方法来设定字符编码,代码如下:

[root@HappyLau demo]# cat book/admin.py
import sys
reload(sys)
sys.setdefaultencoding('utf8') from django.contrib import admin
from book.models import Book
from book.models import Hero admin.site.register(Book)
admin.site.register(Hero)

通过访问http://localhost/admin登陆后的页面如下,可以正常的添加/删除/查询/修改数据内容:

添加书信息:

添加英雄:

6. 自定义管理页面

  默认时候django只现实models中类的信息,可以通过django中的ModelAdmin类来自定义数据的展现,其中list_display列表可以定义需要显示的字段内容,以如下代码为例:

[root@HappyLau demo]# cat book/admin.py
#_*_ coding:utf8 _*_ import sys
reload(sys)
sys.setdefaultencoding('utf8') from django.contrib import admin
from book.models import Book
from book.models import Hero class BookAdmin(admin.ModelAdmin):
'''
定义Book管理需要显示的内容
'''
list_display = ['id','book_name','author_name','publish_date'] class HeroAdmin(admin.ModelAdmin):
'''
定义Hero管理需要现实的内容
'''
list_display = ['id','hero_name','hero_sex','hero_content','hero_book'] admin.site.register(Book,BookAdmin)
admin.site.register(Hero,HeroAdmin)

修改完成后,django页面的关于Hero内容显示如下,显示内容日常不错,哈哈!此外,在这里还支持字段的排序,只需要点击字段中的内容即可实现排序。

管理类中的其他功能:

1. list_display  用于显示列表的内容,作为一个列表而使用,如list_display = ['id','book_name','author_name','publish_date']

2. list_filter   用于在右测显示分组内容,如list_filter = ['book_name']

3. search_fields  用于上面的关键字查询,支持模糊查询,如search_fields = ['id','book_name','author_name','publish_date']

4. list_per_page  用于设置分页,每页所容纳的条目,如list_per_page = 5

如下实现代码:

[root@HappyLau demo]# cat book/admin.py
#_*_ coding:utf8 _*_ import sys
reload(sys)
sys.setdefaultencoding('utf8') from django.contrib import admin
from book.models import Book
from book.models import Hero class BookAdmin(admin.ModelAdmin):
'''
定义Book管理需要显示的内容
'''
list_display = ['id','book_name','author_name','publish_date']
list_filter = ['book_name']
search_fields = ['id','book_name','author_name','publish_date']
list_per_page = 5 class HeroAdmin(admin.ModelAdmin):
'''
定义Hero管理需要现实的内容
'''
list_display = ['id','hero_name','hero_sex','hero_content','hero_book']
search_fields = ['id','hero_name','hero_sex','hero_content','hero_book']
list_filter = ['hero_name']
list_per_page = 5 admin.site.register(Book,BookAdmin)
admin.site.register(Hero,HeroAdmin)

通过上面的代码实现的功能如图:

仔细观察上如,list_display实现表格中的数据内容,list_filter实现右边的分组内容,search_fields实现上部的搜索功能,list_per_page显示每页显示内容。

7. 内嵌页的实现

  如果希望在一个类中包含嵌套另外一个Class,可以采用嵌套的方式来实现,可以基于两种方式实现:admin.StackedInline和admin.TabularInline,如下为测试代码:

[root@HappyLau demo]# cat book/admin.py
#_*_ coding:utf8 _*_ import sys
reload(sys)
sys.setdefaultencoding('utf8') from django.contrib import admin
from book.models import Book
from book.models import Hero #class HeroInline(admin.StackedInline):
class HeroInline(admin.TabularInline):
'''
Hero类的内嵌页类
'''
model = Hero
extra = 2 class BookAdmin(admin.ModelAdmin):
'''
定义Book管理需要显示的内容
'''
list_display = ['id','book_name','author_name','publish_date']
list_filter = ['book_name']
search_fields = ['id','book_name','author_name','publish_date']
list_per_page = 5
fieldsets = [
("基本信息",{ 'fields': [ 'book_name'] }),
("书本更多",{ 'fields': [ 'author_name','publish_date' ]})
]
inlines = [HeroInline] class HeroAdmin(admin.ModelAdmin):
'''
定义Hero管理需要现实的内容
'''
list_display = ['id','hero_name','hero_sex','hero_content','hero_book']
search_fields = ['id','hero_name','hero_sex','hero_content','hero_book']
list_filter = ['hero_name']
list_per_page = 5
fieldsets = [
("基本信息", {'fields': [ 'hero_name','hero_sex' ]}),
("英雄更多", {'fields': [ 'hero_content','hero_book' ]})
] admin.site.register(Book,BookAdmin)
admin.site.register(Hero,HeroAdmin)

可以实现在修改/添加页面中,效果如下:

待续...

人本性懒惰,能战胜懒惰者,少,能长时间坚持者,更少!

Django入门开发之数据模型01的更多相关文章

  1. Django入门之基础篇01

    这是第一篇Django(花音:浆够)入门博客,学习Django的初衷是为了开发自己的个人小小网站(虽然有了博客园,还是想建立自己的博客,因为自主定制,香香香~!)

  2. Django 测试开发3 数据模型models和admin管理工具

    参考:https://blog.csdn.net/weixin_44510615/article/details/89425412 1.Django模型字段常用类型: IntegerField : 整 ...

  3. Django 入门案例开发(上)

    Django 入门案例开发(中) http://www.cnblogs.com/focusBI/p/7858267.html Django是一个重量级的web开发框架,它提供了很多内部已开发好的插件供 ...

  4. Django 入门项目案例开发(上)

    关注微信公众号:FocusBI 查看更多文章:加QQ群:808774277 获取学习资料和一起探讨问题. Django 入门案例开发(中) http://www.cnblogs.com/focusBI ...

  5. Django 入门案例开发

    Django是一个重量级的web开发框架,它提供了很多内部已开发好的插件供我们使用:这里不去描述 Django直接进入开发过程. Django入门案例分两部分:一.开发环境的配置:二.业务需求分析. ...

  6. Django 入门案例开发(中)

    昨天已经描述了如何搭建Django的开发环境,今天描述业务流程,具体我们要实现一个什么样的业务: 以下的业务都是假设的(网上书店   页面做的low): 1.用户注册及登录业务: 这是一个网上书店阅读 ...

  7. 【Python全栈-后端开发】Django入门基础-2

    Django入门基础知识-2 一 .模版 一.模版的组成 HTML代码+逻辑控制代码 二.逻辑控制代码的组成 1  变量(使用双大括号来引用变量) {{var_name}} 2  标签(tag)的使用 ...

  8. Django 入门项目案例开发(中)

    关注微信公众号:FocusBI 查看更多文章:加QQ群:808774277 获取学习资料和一起探讨问题. 昨天已经描述了如何搭建Django的开发环境,今天描述业务流程,具体我们要实现一个什么样的业务 ...

  9. 第六模块:WEB框架开发 第1章·Django框架开发1~50

    01-Django基础介绍 02-Web应用程序1 03-Web应用程序2 04-http请求协议1 05-http请求协议2 06-http协议之响应协议 07-wsgire模块1 08-wsgir ...

随机推荐

  1. bzoj1555 KD之死 贪心+堆优化

    1555: KD之死 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 124  Solved: 54[Submit][Status][Discuss] D ...

  2. Winform下去除MDI窗体边框

    做项目中间遇到了MDI窗体内边框的问题,经过苦苦寻找,最终得到了解决方案 在Main窗体中调用API // Win32 Constants ; ; private const int WS_BORDE ...

  3. PHP 对象数组和一般的数组的相互转化

    Yii2中的对象转数组: $video = Video::find()->asArray()->one(); 把数组转化成任何你想要的对象类型的数组: function array2obj ...

  4. nyoj888 取石子(九) 反Nimm博弈

    这题就是反Nimm博弈--分析见反Nimm博弈 AC代码 #include <cstdio> #include <cmath> #include <algorithm&g ...

  5. tcp/ip 卷一 读书笔记(3)为什么既要有IP地址又要有MAC地址

    网络层 首先明确一点,并不是所有的网络之间传输数据都需要mac地址和ip地址,比如说点对点线路之间的通信就没有MAC地址,网络层使用ipx协议时就没有ip地址,但是在当前的主流网络中,我们都使用ip地 ...

  6. VUE PK REACT(1)

    一.浏览器兼容性 vue: ie9+ react: ie8+ 二.安装使用 vue:1.直接引入  <script src="https://cdn.jsdelivr.net/npm/ ...

  7. 经典案例之MouseJack

    引言:在昨天的文章<无线键鼠监听与劫持>中,我们提到今天会向您介绍一个无线键鼠的监听与劫持的经典案例,<MouseJack>:MouseJack能利用无线鼠标和键盘存在的一些问 ...

  8. hi3531调用sil9024的驱动

    //测试mao  printf("\n\n");    unsigned int cmd=1;    unsigned long arg =4;  fd = open(" ...

  9. 使用ffserver实现转发实时流媒体(摄像头捕获)

    本系统为ubuntu 10.04LTS 说明1:本实验在本机成功测试通过: 说明2:本实验仅仅测试了视频流,未测试音频流. 1.配置ffserver.conf -------------------- ...

  10. WebService之CXF注解之三(Service接口实现类)

    ITeacherServiceImpl.java: /** * @Title:ITeacherServiceImpl.java * @Package:com.you.service.impl * @D ...