Django模型
一.设计系统表
在MVT模型中,Model也是指一个数据模型,数据存储的形式,之前View是视图模块。
在Django的Model模块中可以通过建立数据类的形式完成对数据的管理
1.添加数据模型
在Model文件中输入以下代码:
# 活动表
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('events time') # 活动时间
create_time = models.DateTimeField(auto_now=True) # 创建时间(自动获取当前时间)
def __str__(self):
return self.name
# 嘉宾表
class Guest(models.Model):
event = models.ForeignKey(Event,on_delete=models.CASCADE,default=1) # 关联发布会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) # 创建时间(自动获取当前时间)
class Meta:
unique_together = ("event", "phone")
def __str__(self):
return self.realname
数据中会有自增的id,所以设计时候不需要这个字段,嘉宾需要关联对应
str()方法告诉Python 如何将对象以str 的方式显示出来。所以,为每个模型类添加了__str__()方法。
2.进行数据迁移
创建新建的数据类,blog是这里我的应用名
python manage.py makemigrations blog
Migrations for 'blog':
blog\migrations\0002_event_guest.py
- Create model Event
- Create model Guest
然后是数据应用
python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
Applying blog.0002_event_guest... OK
这里发现之前的event数据是没有默认值,导致数据库建立失败,所以这里增加了一个default值
二.admin 后台管理
1.注册用户类和活动类
修改admin文件,新增已经创建好的数据类
'''Event'''
from blog.models import Event,Guest
admin.site.register(Event)
admin.site.register(Guest)
在admin的后台也可以看到对应的类
2.类中显示更多字段
在新建数据之后,我们需要页面上可以展示更多的数据,这里继续修改admin数据
'''Event'''
from blog.models import Event,Guest
class EventAdmin(admin.ModelAdmin):
list_display = ('name', 'status', 'start_time','id')
class GuestAdmin(admin.ModelAdmin):
list_display = ('realname', 'phone','email','sign','create_time','event')
admin.site.register(Event,EventAdmin)
admin.site.register(Guest,GuestAdmin)
新建了EventAdmin 类,继承django.contrib.admin.ModelAdmin 类,保存着一个类的自定义配置,以供Admin 管理工具使用。这里只自定义了一项:list_display,它是一个字段名称的数组,用于定义要在列表中显示哪些字段
3.增加搜索和过滤功能
Admin管理系统自带就有搜索和过滤功能这里修改类的文件实行绑定
class EventAdmin(admin.ModelAdmin):
list_display = ['name', 'status', 'start_time','id']
search_fields = ['name']#搜索栏
list_filter = ['status']#过滤器
class GuestAdmin(admin.ModelAdmin):
list_display = ['realname', 'phone','email','sign','create_time','event']
search_fields = ['realname','phone']#搜索栏
list_filter = ['sign']#过滤器
可以看到新增了search_fields,list_filter字段,这就确定了根据不同的数据我们要依据什么来过滤
三.基本数据访问
1.进入Django的shell模式
在Django操作数据库,我们需要开启shell脚本对数据库的操作
python manage.py shell
Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 14:05:16) [MSC v.1915 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
举个例子:
导入Blog 应用下的models.py 中的Event 表和Guest 表;获得table(Event、Gues 表)中的所有对象。
>>> from blog.models import Event,Guest
>>> Event.objects.all()
<QuerySet [<Event: 苹果发布会>, <Event: 小米发布会>]>
>>> Guest.objects.all()
<QuerySet [<Guest: jack>]>
2.shell插入数据
- 使用创建+save方法
>>> from datetime import datetime
>>> e1 = Event(id=2,name='红米Pro 发布会',limit=2000,status=True,address='北京水立方',start_time=datetime(2016,8,10,14,0,0))
>>> e1.save()
C:\Python37\lib\site-packages\django-2.2.4-py3.7.egg\django\db\models\fields\__init__.py:1421: RuntimeWarning: DateTimeField Event.st
art_time received a naive datetime (2016-08-10 14:00:00) while time zone support is active.
RuntimeWarning)
- 使用create方法
>>> Event.objects.create(id=3,name='大米MAX 发布会',limit=2000,status=True,address='BJ会展中心',start_time=datetime(2016,9,22,14,0,0))
这里增加的事件是自增的
3.shell查询数据
- 精确查询
table.objects.get()方法用于从数据库表中取得一条匹配的结果,返回一个对象,如果记录不存在的话,那么它会报DoesNotExist 类型错误。
>>> e2 = Event.objects.get(name='大米MAX 发布会')
>>> e2
<Event: 大米MAX 发布会>
>>> e2.address
'BJ会展中心'
- 模糊匹配
table.objects.filter()方法是从数据库的取得匹配的结果,返回一个对象列表,如果记录不存在的话,它会返回[]。
>>> e3 = Event.objects.filter(name__contains='发布会')
>>> e3
<QuerySet [<Event: 苹果发布会>, <Event: 红米Pro 发布会>, <Event: 大米MAX 发布会>]>
在name 和contains 之间用双下划线。这里,contains 部分会被Django 翻译成LIKE 语句。
- get查询
>>> g1 = Guest.objects.get(realname='Andy')
>>> g1
<Guest: Andy>
4.shell删除数据
删除查询的数据
>>> g2 = Guest.objects.get(realname='Mark')
>>> g2
<Guest: Mark>
>>> g2.delete()
(1, {'blog.Guest': 1})
感觉这个有些没有完全删除,通过shell
5.更新数据
直接更新数据即可,记得最后保存数据
>>> from blog.models import Event,Guest
>>> g1 = Guest.objects.get(realname = 'Andy')
>>> g1
<Guest: Andy>
>>> g1.realname = 'Allen'
>>> g1
<Guest: Allen>
>>>g1.save()
四.配置MySQL
这里需要安装好本地的Mysql然后把Django链接上Mysql,然后进行发布会使用
1.安装Mysql
这里自行查看菜鸟的链接
https://www.runoob.com/mysql/mysql-install.html
- 启动mysql
输入以下命令
net start mysql
- 密码
root@localhost root
- 创建一个我们项目使用的Guest库
CREATE DATABASE guest CHARACTER SET utf8;
2.安装PyMySQL
pip install PyMySQL
3.配置Django链接MySQL
- 使用Navicate链接
查看以下文章:https://blog.csdn.net/qq_22211217/article/details/80415248
4.进行Django的数据迁移
- 修改setting中数据库配置
修改成
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1',
'PORT': '3306',
'NAME': 'guest',
'USER': 'root',
'PASSWORD': 'root',
'OPTIONS': {
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
},
}
}
- 进行数据迁移
python manage.py makemigrations
python manage.py migrate
在迁移时候遇到几个坑
报错:django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 or newer is required; you have 0.7.11.None
解决方法:找到Python安装路劲下的Python36-32\Lib\site-packages\django\db\backends\mysql\base.py文件
将文件中的如下代码注释
if version < (1, 3, 3):
raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)
继续报错:AttributeError: 'str' object has no attribute 'decode'
解决方法:找到C:\Python37\lib\site-packages\django-2.2.4-py3.7.egg\django\db\backends\mysql\operations.py"文件
将以下代码注释
if query is not None:
query = query.decode(errors='replace')哦:
- 重建管理员账号
因为迁移了数据库,所以超级管理员帐号也要重建
python manage.py createsuperuser