【Mac系统 + Python + Django】之开发一个发布会系统【Django模型(三)】
上一部分给大家介绍Django的视图。
接下来继续来了解Django框架,来看第三部分,此部分是对数据库的操作。
目录:
一、设计系统表
- 四、Django配置MySQL
一、设计系统表 返回目录
首先打开sign/models.py,通过模型完成标的创建:
from django.db import models # Create your models here. # 发布会表
class Event(models.Model): name = models.CharField(max_length=100) # 发布会标题
limit = models.IntegerField() # 参加人数
status = models.BooleanField() # 状态
address = models.CharField(max_length=200) # 地址
start_time = models.DateTimeField("event time") # 发布会时间
create_time = models.DateTimeField(auto_now=True) # 创建时间(自动获取当前时间) def __str__(self):
return self.name # 嘉宾表
class Guest(models.Model): event = models.ForeignKey(Event) # 关联发布会id
realname = models.CharField(max_length=64) # 姓名
phone = models.CharField(max_length=16) # 手机号
email = models.EmailField() # 邮箱
sign = models.BooleanField() # 签到状态
create_time = models.DateTimeField(auto_now=True) # 创建时间(自动获取当前时间)
def __str__(self):
return self.realname
class Meta: unique_together = ("event","phone")
模型创建好后,进行数据迁移:
打开终端执行:
test:guest zhan$ python manage.py makemigrations sign
Migrations for 'sign':
sign/migrations/0001_initial.py:
- Create model Event
- Create model Guest
test:guest zhan$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, sign
Running migrations:
Applying sign.0001_initial... OK
sign/migrations/下会生成0001_initial.py文件:
二、admin后台管理 返回目录
首先,在sign/admin.py文件中写入:
from django.contrib import admin
from sign.models import Event,Guest # Register your models here.
# 这些代码通知Admin管理工具为这些模块提供界面
admin.site.register(Event)
admin.site.register(Guest)
如下图:
登录Admin后台系统:http://127.0.0.1:8000/admin/
添加发布会:
列表显示一列发布会名字,是因为自己定义了__str__():里面的name
如果想显示全部的列表字段,则在 sign/admin.py中继续添加:
from django.contrib import admin
from sign.models import Event,Guest # Register your models here.
# 添加两个方法,把字段值放在list_display中
class EventAdmin(admin.ModelAdmin):
list_display = ["id","name","limit","status","address","start_time","create_time"] class GuestAdmin(admin.ModelAdmin):
list_display = ["event","realname","phone","email","sign","create_time"] # 这些代码通知Admin管理工具为这些模块提供界面
admin.site.register(Event,EventAdmin) # 并添加class进来
admin.site.register(Guest,GuestAdmin)
还可以添加【搜索栏、过滤器】,在sign/admin.py中继续添加:
from django.contrib import admin
from sign.models import Event,Guest # Register your models here. class EventAdmin(admin.ModelAdmin):
list_display = ["id","name","limit","status","address","start_time","create_time"]
search_fields = ["name"] # 搜索栏
list_filter = ["status"] # 过滤器 class GuestAdmin(admin.ModelAdmin):
list_display = ["event","realname","phone","email","sign","create_time"]
search_fields = ["realname","phone"] # 搜索栏
list_filter = ["sign"] # 过滤器 # 这些代码通知Admin管理工具为这些模块提供界面
admin.site.register(Event,EventAdmin)
admin.site.register(Guest,GuestAdmin)
search_fields:用于创建搜索栏,可以设置匹配多个关键字。
list_filter:用于创建字段过滤器。
三、基本数据访问(SQLite数据库) 返回目录
下面我们通过Django自带的SQLite操作数据库,如何通过数据库进行操作呢,需要命令行运行manage.py的shell命令
python manage.py shell
1、插入语句
# 准备条件
>>> from sign.models import Event,Guest
>>> from datetime import datetime
>>> Event.objects.all()
<QuerySet [<Event: 小米发布会>]>
>>> Guest.objects.all()
<QuerySet [<Guest: zc>]>
①第一种插入语句:创建和保存
insert_e1 = Event(id='2',
name='魅族发布会',
limit='1000',
status=True,
address='天津梅江会展',
start_time=datetime(2018,10,15,12,0,0)) insert_e1.save()
②第二种插入语句:直接创建
Event.objects.create(id='2',
name='魅族发布会',
limit='1000',
status=True,
address='天津梅江会展',
start_time=datetime(2018,10,15,12,0,0))
Guest.objects.create(realname='owen',
phone= '136',
email='136@qq.com',
sign=False,
event_id='2')
但是会提示警告信息:
1430: RuntimeWarning: DateTimeField Event.start_time received a naive datetime (2018-10-15 12:00:00) while time zone support is active.
RuntimeWarning)
UTC问题,可以忽略此问题,guest/settings.py中,设置USE_TZ = False。
2、查询语句
(1)精确查询
address作为查询条件,查询name
>>> e1 = Event.objects.get(address = '天津梅江会展')
>>> e1.name
'魅族发布会'
# 或者
>>> Event.objects.get(address = '天津梅江会展').name
'魅族发布会'
>>>
相对应的Guest表:
>>> g1 = Guest.objects.get(realname__contains='ow')
>>> g1.event
<Event: 魅族发布会>
>>> g1.event.name
'魅族发布会'
>>> g1.event.address
'天津梅江会展'
>>>
(2)模糊查询
只想查询关键字
filter()方法是从数据库中取得匹配结果,返回的是列表;name与contains双下划线连接,contains类似于LIKE语句。
>>> Event.objects.filter(name__contains='发布会')
<QuerySet [<Event: 小米发布会>, <Event: 魅族发布会>]>
>>>
(3)删除数据
注:我写的是模糊查询删除,最好是精确删除。
>>> g1 = Guest.objects.get(realname__contains='ow')
>>> g1.delete()
(1, {'sign.Guest': 1})
>>> # 或者
>>> Guest.objects.get(realname__contains='ow').delete()
(1, {'sign.Guest': 1})
>>>
(4)更新数据
>>> g1 = Guest.objects.get(realname__contains='ow')
>>> g1.realname='owen02'
>>> g1.save()
>>> # 或者 Guest.objects.select_for_update().filter(realname__contains='ow').update(realname='owen')
1
四、Django配置MySQL 返回目录
虽然SQLite数据库可以操作数据,但是不适用于大型项目,下面来介绍MySQL数据库在Django中的操作。
1、安装Mysql数据库
参考我的另一篇文章:《【Mac系统 + Mysql】之安装Mysql数据库》
2、MySQL数据库基本操作
数据库操作:
# 进入mysql
mysql -u root -p
# 查看数据库
show databases; # 创建数据库
create database if not exists guest; # 进入guest数据库
use guest; # 查看数据库的表
show tables; # 创建表
create table if not exists sign_guest(
id int unsigned auto_increment,
realname varchar(100)not null,
phone varchar(16) not null,
email VARCHAR(20) UNIQUE, # UNIQUE:不可重复,只有null是可以重复
sign varchar(5),
create_time date,
primary key(id,phone)
)charset=utf8; # 查看表属性
desc sign_guest; # 插入数据
insert into sign_guest(realname,phone,email,sign,create_time)values
('zc','','123@qq.com','',now())
3、安装pymysql
安装命令:
pip install pymysql
具体操作可参考我的文章:《【Python + Mysql】之用pymysql库连接Mysql数据库并进行增删改查操作》
在此忽略......
4、在Django中配置MySQL
修改guest/settings.py下的DATABASES
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 驱动
'HOST': '127.0.0.1', # 主机地址
'PORT': '', # 端口号
'NAME': 'guest', # 数据库
'USER': 'root', # 登录用户名
'PASSWORD': '', # 登录密码
'OPTIONS': {
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
},
}
}
在guest项目中输入命令:
test:guest zhan$ python manage.py migrate
但是报错:
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named 'MySQLdb'
原因为没有MySQLdb驱动,解决办法如下:
在.../guest/__init__.py中添加代码:
import pymysql pymysql.install_as_MySQLdb()
然后再执行命令:
python manage.py migrate
但是,会提示错误,如果没有问题跳过此段落:
......
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying sessions.0001_initial... OK
Applying sign.0001_initial...Traceback (most recent call last):
...
...
...
pymysql.err.InternalError: (1050, "Table 'sign_guest' already exists")
原因为我在上面写mysql基本数据库操作时候,自己创建了sign_guest表,所以最好删除guest数据库,重新再执行一遍命令。
终端进入数据库,具体操作不描述,上面基本操作介绍过。
# 删除数据库
drop database guest; # 创建数据库
create database guest;
再执行命令:
python manage.py migrate
正确显示如下:
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, sign
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... 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 auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying sessions.0001_initial... OK
Applying sign.0001_initial... OK
因为更换了数据库,所以里面的Admin超级管理员账号也需要重新创建。
然后再终端输入命令:
python manage.py createsuperuser
Username (leave blank to use 'zhan'): admin
Email address: xxx@xxx.com
Password:
Password (again):
Superuser created successfully.
至此,Django的模型创建完毕,下一篇介绍Django模板
【Mac系统 + Python + Django】之开发一个发布会系统【Django模型(三)】的更多相关文章
- 【Mac系统 + Python + Django】之开发一个发布会系统【Django视图(二)】
此学习资料是通过虫师的python接口自动化出的书学习而来的,在此说明一下,想学习更多的自动化的同学可以找虫师的博客园,非广告,因为我python+selenium自动化也是跟虫师学的,学习效果很好的 ...
- 基于django快速开发一个网站(一)
基于django快速开发一个网站(一) * 创建虚拟环境.基于虚拟环境创建django==2.0.0和图片加载库和mysql数据库驱动 1. 创建目录并创建虚拟环境 ╰$ mkdir Cornuco ...
- Django快速开发之投票系统
https://docs.djangoproject.com/en/1.8/intro/tutorial01/ 参考官网文档,创建投票系统. ================ Windows 7/1 ...
- Python全栈开发-web框架之django
一:web框架 什么是web框架? Web应用框架(Web application framework)是一种开发框架,用来支持动态网站.网络应用程序及网络服务的开发.这种框架有助于减轻网页开发时共通 ...
- python全栈开发day73-Django认证系统
一.Form组件 day73 2018-08-10 1. 内容回顾 1. form表单组件 1. 常用字段 1. CharField() 2. ChoiceField() 2. 参数或配置 1. la ...
- 使用一个Python脚本来运行一个简单的Django项目
创建视图 Django是一个模型-模板-视图(model-template-view,MTV)框架. 视图部分通常检查看HTTP给出的请求和查询或者结构,这些信息是发送到表示层的数据. 我们在 hel ...
- Django Web开发【1】Django简介
前言 看完<Django Book>之后, 总想找个实例来实战开发下,无奈国内Django的书籍相当少,只能从英文书籍中吸取养料,偶然之后得到Learning Website Develo ...
- django测试开发-1.开始Hello django!
用python开发出一个web页面的时候,需要找一个支持python语言的web框架.django框架有丰富的文档和学习资料,也是非常成熟的web开发框架,本篇写一个简单的“hello django! ...
- python全栈开发 * 继承性 层叠性 盒模型 标准文档流 * 180809
---恢复内容开始--- 一继承性 1.继承: 给父级设置一些属性,子级继承了父级的该属性,这就是我们的css中的继承. 2. 可继承: color . font-*(size). text-*(de ...
随机推荐
- Linux之ps查找进程用kill终止命令
http://www.cnblogs.com/peida/archive/2012/12/20/2825837.html http://blog.csdn.net/andy572633/article ...
- [HTML/CSS]margin属性用法
概述 在一些小的项目中,前台样式还是需要自己来写的,这时候,margin在布局中还是有一定的地位的.上篇文章中介绍的盒子模型中,就有margin的存在. margin margin可以用来设置css块 ...
- 【js】判断浏览器是否IE浏览器
搜罗各种方法来判断浏览器是否为IE浏览器 1.最简单的[来自:http://www.cnblogs.com/heganlin/p/5889743.html] if(!+[1,]){ layer.msg ...
- Kubernetes用户指南(四)--应用检查和调试
一.调试 当你的应用开始运行,那么DEBUG是不可避免的问题. 早些时候,我们在描述的是如何通过kubectl get pods来获得Pod的简单状态信息. 但是现在,这里有更多的方式来获得关于你的应 ...
- 【重点突破】—— 当better-scroll 遇见Vue
前言:在学习黄轶老师的<Vue.js高仿饿了么外卖App>课程中接触到了better-scroll第三方JavaScript组件库,这是黄轶老师自己基于iscroll重写的库.这里结合黄轶 ...
- python获取当前文件路径
python获取当前文件路径 学习了:https://www.cnblogs.com/strongYaYa/p/7200357.html https://blog.csdn.net/heatdeath ...
- Node.js meitulu图片批量下载爬虫1.06版
//====================================================== // https://www.meitulu.com图片批量下载Node.js爬虫1. ...
- 在FASTBuild中使用Distribution
上一篇:在FASTBuild中使用Caching 在FASTBuild中使用分布式(distribution)编译需要注意以下四个环节. 一.编译器设置 某些编译过程与分布式相矛盾,如果一个对象不能被 ...
- EJB学习笔记之十(BMT事务和CMT事务)
1.前言 前两篇博客主要介绍了与事务相关的知识.比如事务的一些特性,以及并发产生的问题.本篇来解说一下EJB中两种处理事务的方式.一种是以生命式方式来管理事务(CMT):还有一种则是在EJB内部使用 ...
- 开启GodMode
上帝模式的开启方法:首先你可以在任何地方创建一个新文件夹,这个操作对于几乎所有电脑用户来说都非常简单,然后重要的是,将这个新文件夹重命名为 “GodMode.{ED7BA470-8E54-465E-8 ...