1、设计系统表html
2、admin后台管理python
3、基本数据访问(SQLite数据库)mysql
首先打开sign/models.py,经过模型完成标的建立:sql
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")
模型建立好后,进行数据迁移:shell
打开终端执行:数据库
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文件:django
首先,在sign/admin.py文件中写入:session
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:用于建立字段过滤器。
下面咱们经过Django自带的SQLite操做数据库,如何经过数据库进行操做呢,须要命令行运行manage.py的shell命令
python manage.py shell
# 准备条件
>>> 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。
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 '天津梅江会展' >>>
只想查询关键字
filter()方法是从数据库中取得匹配结果,返回的是列表;name与contains双下划线链接,contains相似于LIKE语句。
>>> Event.objects.filter(name__contains='发布会') <QuerySet [<Event: 小米发布会>, <Event: 魅族发布会>]> >>>
注:我写的是模糊查询删除,最好是精确删除。
>>> g1 = Guest.objects.get(realname__contains='ow') >>> g1.delete() (1, {'sign.Guest': 1}) >>> # 或者 >>> Guest.objects.get(realname__contains='ow').delete() (1, {'sign.Guest': 1}) >>>
>>> 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
虽然SQLite数据库能够操做数据,可是不适用于大型项目,下面来介绍MySQL数据库在Django中的操做。
参考个人另外一篇文章:《【Mac系统 + Mysql】之安装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','16612345678','123@qq.com','1',now())
安装命令:
pip install pymysql
具体操做可参考个人文章:《【Python + Mysql】之用pymysql库链接Mysql数据库并进行增删改查操做》
在此忽略......
修改guest/settings.py下的DATABASES
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 驱动 'HOST': '127.0.0.1', # 主机地址 'PORT': '3306', # 端口号 'NAME': 'guest', # 数据库 'USER': 'root', # 登陆用户名 'PASSWORD': '1234567', # 登陆密码 '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模板