上一部分给大家介绍Django的视图

接下来继续来了解Django框架,来看第三部分,此部分是对数据库的操作。

目录:

一、设计系统表            返回目录

首先打开sign/models.py,通过模型完成标的创建:

  1. from django.db import models
  2.  
  3. # Create your models here.
  4.  
  5. # 发布会表
  6. class Event(models.Model):
  7.  
  8. name = models.CharField(max_length=100) # 发布会标题
  9. limit = models.IntegerField() # 参加人数
  10. status = models.BooleanField() # 状态
  11. address = models.CharField(max_length=200) # 地址
  12. start_time = models.DateTimeField("event time") # 发布会时间
  13. create_time = models.DateTimeField(auto_now=True) # 创建时间(自动获取当前时间)
  14.  
  15. def __str__(self):
  16. return self.name
  17.  
  18. # 嘉宾表
  19. class Guest(models.Model):
  20.  
  21. event = models.ForeignKey(Event) # 关联发布会id
  22. realname = models.CharField(max_length=64) # 姓名
  23. phone = models.CharField(max_length=16) # 手机号
  24. email = models.EmailField() # 邮箱
  25. sign = models.BooleanField() # 签到状态
  26. create_time = models.DateTimeField(auto_now=True) # 创建时间(自动获取当前时间)
  1. def __str__(self):
  2. return self.realname
  1. class Meta: unique_together = ("event","phone")

模型创建好后,进行数据迁移:

打开终端执行:

  1. test:guest zhan$ python manage.py makemigrations sign
  2. Migrations for 'sign':
  3. sign/migrations/0001_initial.py:
  4. - Create model Event
  5. - Create model Guest
  6. test:guest zhan$ python manage.py migrate
  7. Operations to perform:
  8. Apply all migrations: admin, auth, contenttypes, sessions, sign
  9. Running migrations:
  10. Applying sign.0001_initial... OK

sign/migrations/下会生成0001_initial.py文件:

二、admin后台管理           返回目录

首先,在sign/admin.py文件中写入:

  1. from django.contrib import admin
  2. from sign.models import Event,Guest
  3.  
  4. # Register your models here.
  5. # 这些代码通知Admin管理工具为这些模块提供界面
  6. admin.site.register(Event)
  7. admin.site.register(Guest)

如下图:

登录Admin后台系统:http://127.0.0.1:8000/admin/

添加发布会:

列表显示一列发布会名字,是因为自己定义了__str__():里面的name

如果想显示全部的列表字段,则在 sign/admin.py中继续添加:

  1. from django.contrib import admin
  2. from sign.models import Event,Guest
  3.  
  4. # Register your models here.
  5. # 添加两个方法,把字段值放在list_display中
  6. class EventAdmin(admin.ModelAdmin):
  7. list_display = ["id","name","limit","status","address","start_time","create_time"]
  8.  
  9. class GuestAdmin(admin.ModelAdmin):
  10. list_display = ["event","realname","phone","email","sign","create_time"]
  11.  
  12. # 这些代码通知Admin管理工具为这些模块提供界面
  13. admin.site.register(Event,EventAdmin)  # 并添加class进来
  14. admin.site.register(Guest,GuestAdmin)  

还可以添加【搜索栏、过滤器】,在sign/admin.py中继续添加:

  1. from django.contrib import admin
  2. from sign.models import Event,Guest
  3.  
  4. # Register your models here.
  5.  
  6. class EventAdmin(admin.ModelAdmin):
  7. list_display = ["id","name","limit","status","address","start_time","create_time"]
  8. search_fields = ["name"] # 搜索栏
  9. list_filter = ["status"] # 过滤器
  10.  
  11. class GuestAdmin(admin.ModelAdmin):
  12. list_display = ["event","realname","phone","email","sign","create_time"]
  13. search_fields = ["realname","phone"] # 搜索栏
  14. list_filter = ["sign"] # 过滤器
  15.  
  16. # 这些代码通知Admin管理工具为这些模块提供界面
  17. admin.site.register(Event,EventAdmin)
  18. admin.site.register(Guest,GuestAdmin)

search_fields:用于创建搜索栏,可以设置匹配多个关键字。

list_filter:用于创建字段过滤器。

三、基本数据访问(SQLite数据库)     返回目录

下面我们通过Django自带的SQLite操作数据库,如何通过数据库进行操作呢,需要命令行运行manage.py的shell命令

  1. python manage.py shell

1、插入语句

  1. # 准备条件
    >>> from sign.models import Event,Guest
  2. >>> from datetime import datetime
  3. >>> Event.objects.all()
  4. <QuerySet [<Event: 小米发布会>]>
  5. >>> Guest.objects.all()
  6. <QuerySet [<Guest: zc>]>

①第一种插入语句:创建和保存

  1. insert_e1 = Event(id='2',
  2. name='魅族发布会',
  3. limit='1000',
  4. status=True,
  5. address='天津梅江会展',
  6. start_time=datetime(2018,10,15,12,0,0))
  7.  
  8. insert_e1.save()

②第二种插入语句:直接创建

  1. Event.objects.create(id='2',
  2. name='魅族发布会',
  3. limit='1000',
  4. status=True,
  5. address='天津梅江会展',
  6. start_time=datetime(2018,10,15,12,0,0))
  1. Guest.objects.create(realname='owen',
    phone= '136',
    email='136@qq.com',
    sign=False,
    event_id='2')

但是会提示警告信息:

  1. 1430: RuntimeWarning: DateTimeField Event.start_time received a naive datetime (2018-10-15 12:00:00) while time zone support is active.
  2. RuntimeWarning)

UTC问题,可以忽略此问题,guest/settings.py中,设置USE_TZ = False。

2、查询语句

(1)精确查询

address作为查询条件,查询name

  1. >>> e1 = Event.objects.get(address = '天津梅江会展')
  2. >>> e1.name
  3. '魅族发布会'

  4. # 或者

>>> Event.objects.get(address = '天津梅江会展').name
'魅族发布会'
>>>

  1.  

相对应的Guest表:

  1. >>> g1 = Guest.objects.get(realname__contains='ow')
  2. >>> g1.event
  3. <Event: 魅族发布会>
  4. >>> g1.event.name
  5. '魅族发布会'
  6. >>> g1.event.address
  7. '天津梅江会展'
  8. >>>

(2)模糊查询

只想查询关键字

filter()方法是从数据库中取得匹配结果,返回的是列表;name与contains双下划线连接,contains类似于LIKE语句。

  1. >>> Event.objects.filter(name__contains='发布会')
  2. <QuerySet [<Event: 小米发布会>, <Event: 魅族发布会>]>
  3. >>>

(3)删除数据

注:我写的是模糊查询删除,最好是精确删除。

  1. >>> g1 = Guest.objects.get(realname__contains='ow')
  2. >>> g1.delete()
  3. (1, {'sign.Guest': 1})
  4. >>>
  5.  
  6. # 或者
  7. >>> Guest.objects.get(realname__contains='ow').delete()
  8. (1, {'sign.Guest': 1})
  9. >>>

(4)更新数据

  1. >>> g1 = Guest.objects.get(realname__contains='ow')
  2. >>> g1.realname='owen02'
  3. >>> g1.save()
  4. >>>
  5.  
  6. # 或者
  7.  
  8. Guest.objects.select_for_update().filter(realname__contains='ow').update(realname='owen')
  9. 1

四、Django配置MySQL         返回目录

虽然SQLite数据库可以操作数据,但是不适用于大型项目,下面来介绍MySQL数据库在Django中的操作。

1、安装Mysql数据库

参考我的另一篇文章:《【Mac系统 + Mysql】之安装Mysql数据库

2、MySQL数据库基本操作

数据库操作:

  1. # 进入mysql
  2. mysql -u root -p
  1. # 查看数据库
  2. show databases;
  3.  
  4. # 创建数据库
  5. create database if not exists guest;
  6.  
  7. # 进入guest数据库
  8. use guest;
  9.  
  10. # 查看数据库的表
  11. show tables;
  12.  
  13. # 创建表
  14. create table if not exists sign_guest(
  15. id int unsigned auto_increment,
  16. realname varchar(100)not null,
  17. phone varchar(16) not null,
  18. email VARCHAR(20) UNIQUE, # UNIQUE:不可重复,只有null是可以重复
  19. sign varchar(5),
  20. create_time date,
  21. primary key(id,phone)
  22. )charset=utf8;
  23.  
  24. # 查看表属性
  25. desc sign_guest;
  26.  
  27. # 插入数据
  28. insert into sign_guest(realname,phone,email,sign,create_time)values
    ('zc','','123@qq.com','',now())

3、安装pymysql

安装命令:

  1. pip install pymysql

具体操作可参考我的文章:《【Python + Mysql】之用pymysql库连接Mysql数据库并进行增删改查操作

在此忽略......

4、在Django中配置MySQL

修改guest/settings.py下的DATABASES

  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.mysql', # 驱动
  4. 'HOST': '127.0.0.1', # 主机地址
  5. 'PORT': '', # 端口号
  6. 'NAME': 'guest', # 数据库
  7. 'USER': 'root', # 登录用户名
  8. 'PASSWORD': '', # 登录密码
  9. 'OPTIONS': {
  10. 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
  11. },
  12. }
  13. }

在guest项目中输入命令:

test:guest zhan$ python manage.py migrate

但是报错:

django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named 'MySQLdb'

原因为没有MySQLdb驱动,解决办法如下:

在.../guest/__init__.py中添加代码:

  1. import pymysql
  2.  
  3. pymysql.install_as_MySQLdb()

然后再执行命令:

  1. 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数据库,重新再执行一遍命令。

终端进入数据库,具体操作不描述,上面基本操作介绍过。

  1. # 删除数据库
  2. drop database guest;
  3.  
  4. # 创建数据库
  5. create database guest;

再执行命令:

  1. python manage.py migrate

正确显示如下:

  1. Operations to perform:
  2. Apply all migrations: admin, auth, contenttypes, sessions, sign
  3. Running migrations:
  4. Applying contenttypes.0001_initial... OK
  5. Applying auth.0001_initial... OK
  6. Applying admin.0001_initial... OK
  7. Applying admin.0002_logentry_remove_auto_add... OK
  8. Applying contenttypes.0002_remove_content_type_name... OK
  9. Applying auth.0002_alter_permission_name_max_length... OK
  10. Applying auth.0003_alter_user_email_max_length... OK
  11. Applying auth.0004_alter_user_username_opts... OK
  12. Applying auth.0005_alter_user_last_login_null... OK
  13. Applying auth.0006_require_contenttypes_0002... OK
  14. Applying auth.0007_alter_validators_add_error_messages... OK
  15. Applying auth.0008_alter_user_username_max_length... OK
  16. Applying sessions.0001_initial... OK
  17. Applying sign.0001_initial... OK

因为更换了数据库,所以里面的Admin超级管理员账号也需要重新创建。

然后再终端输入命令:

  1. python manage.py createsuperuser
  1. Username (leave blank to use 'zhan'): admin
  2. Email address: xxx@xxx.com
  3. Password:
  4. Password (again):
  5. Superuser created successfully.

至此,Django的模型创建完毕,下一篇介绍Django模板 


【Mac系统 + Python + Django】之开发一个发布会系统【Django模型(三)】的更多相关文章

  1. 【Mac系统 + Python + Django】之开发一个发布会系统【Django视图(二)】

    此学习资料是通过虫师的python接口自动化出的书学习而来的,在此说明一下,想学习更多的自动化的同学可以找虫师的博客园,非广告,因为我python+selenium自动化也是跟虫师学的,学习效果很好的 ...

  2. 基于django快速开发一个网站(一)

    基于django快速开发一个网站(一) *  创建虚拟环境.基于虚拟环境创建django==2.0.0和图片加载库和mysql数据库驱动 1. 创建目录并创建虚拟环境 ╰$ mkdir Cornuco ...

  3. Django快速开发之投票系统

    https://docs.djangoproject.com/en/1.8/intro/tutorial01/ 参考官网文档,创建投票系统. ================ Windows  7/1 ...

  4. Python全栈开发-web框架之django

    一:web框架 什么是web框架? Web应用框架(Web application framework)是一种开发框架,用来支持动态网站.网络应用程序及网络服务的开发.这种框架有助于减轻网页开发时共通 ...

  5. python全栈开发day73-Django认证系统

    一.Form组件 day73 2018-08-10 1. 内容回顾 1. form表单组件 1. 常用字段 1. CharField() 2. ChoiceField() 2. 参数或配置 1. la ...

  6. 使用一个Python脚本来运行一个简单的Django项目

    创建视图 Django是一个模型-模板-视图(model-template-view,MTV)框架. 视图部分通常检查看HTTP给出的请求和查询或者结构,这些信息是发送到表示层的数据. 我们在 hel ...

  7. Django Web开发【1】Django简介

    前言 看完<Django Book>之后, 总想找个实例来实战开发下,无奈国内Django的书籍相当少,只能从英文书籍中吸取养料,偶然之后得到Learning Website Develo ...

  8. django测试开发-1.开始Hello django!

    用python开发出一个web页面的时候,需要找一个支持python语言的web框架.django框架有丰富的文档和学习资料,也是非常成熟的web开发框架,本篇写一个简单的“hello django! ...

  9. python全栈开发 * 继承性 层叠性 盒模型 标准文档流 * 180809

    ---恢复内容开始--- 一继承性 1.继承: 给父级设置一些属性,子级继承了父级的该属性,这就是我们的css中的继承. 2. 可继承: color . font-*(size). text-*(de ...

随机推荐

  1. Tomcat部署时war和war exploded的区别

    转自徐刘根的Tomcat部署时war和war exploded区别以及平时踩得坑 一.war和war exploded的区别 在使用IDEA开发项目的时候,部署Tomcat的时候通常会出现下边的情况: ...

  2. JavaScript的map循环、forEach循环、filter循环、reduce循环、reduceRight循环

    1.map循环 let arr=[1,2,3,4]; arr.map(function(value,key,arr){ //值,索引,数组(默认为选定数组) return item; //如果没有re ...

  3. golangWEB框架gin学习之路由群组

    原文地址:http://www.niu12.com/article/42 package main import ( "github.com/gin-gonic/gin" &quo ...

  4. gulp的入门浅析

    阅读目录 介绍gulp 安装gulp gulpfile.js 运行gulp 介绍gulp的api 介绍gulp gulp是基于Nodejs的自动任务运行器, 她能自动化地完成 javascript/c ...

  5. http://blog.csdn.net/a942980741/article/details/39990699

    http://blog.csdn.net/a942980741/article/details/39990699

  6. sqls

    ALTER TABLE `shh_data`.`topic_floor` ADD COLUMN `updated_date` DATETIME NULL AFTER `publish_date`,AD ...

  7. RocketMQ性能压测分析(转)

    原创文章,转载请注明出处:http://jameswxx.iteye.com/blog/2093785 一   机器部署 1.1  机器组成 1台nameserver 1台broker  异步刷盘 2 ...

  8. unity3d NGUI 本地化 多语言

    原地址:http://cl314413.blog.163.com/blog/static/1905079762014421115528670/ NGUI的本地化操作: Localization UIL ...

  9. 在 XenServer上调试windows程序

    WinDbg WinDbg is one of a number of tools available from Microsoft that can be used for debugging Wi ...

  10. 长sql 语句拼接

    长sql 语句拼接