在MVT模型中,Model也是指一个数据模型,数据存储的形式,之前View是视图模块。
在Django的Model模块中可以通过建立数据类的形式完成对数据的管理
在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__()方法。
创建新建的数据类,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文件,新增已经创建好的数据类
'''Event'''
from blog.models import Event,Guest
admin.site.register(Event)
admin.site.register(Guest)
在admin的后台也可以看到对应的类
在新建数据之后,我们需要页面上可以展示更多的数据,这里继续修改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,它是一个字段名称的数组,用于定义要在列表中显示哪些字段
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字段,这就确定了根据不同的数据我们要依据什么来过滤
在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()
, ]>
>>> Guest.objects.all()
]>
>>> 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)
>>> Event.objects.create(id=3,name='大米MAX 发布会',limit=2000,status=True,address='BJ会展中心',start_time=datetime(2016,9,22,14,0,0))
这里增加的事件是自增的
>>> e2 = Event.objects.get(name='大米MAX 发布会')
>>> e2
>>> e2.address
'BJ会展中心'
>>> e3 = Event.objects.filter(name__contains='发布会')
>>> e3
, , ]>
在name 和contains 之间用双下划线。这里,contains 部分会被Django 翻译成LIKE 语句。
>>> g1 = Guest.objects.get(realname='Andy')
>>> g1
删除查询的数据
>>> g2 = Guest.objects.get(realname='Mark')
>>> g2
>>> g2.delete()
(1, {'blog.Guest': 1})
感觉这个有些没有完全删除,通过shell
直接更新数据即可,记得最后保存数据
>>> from blog.models import Event,Guest
>>> g1 = Guest.objects.get(realname = 'Andy')
>>> g1
>>> g1.realname = 'Allen'
>>> g1
>>>g1.save()
这里需要安装好本地的Mysql然后把Django链接上Mysql,然后进行发布会使用
这里自行查看菜鸟的链接
https://www.runoob.com/mysql/mysql-install.html
输入以下命令
net start mysql
root@localhost root
CREATE DATABASE guest CHARACTER SET utf8;
pip install PyMySQL
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