【Django】Day4-模型

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()
, ]>
>>> Guest.objects.all()
]>

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

>>> e2.address
'BJ会展中心'
  • 模糊匹配
    table.objects.filter()方法是从数据库的取得匹配的结果,返回一个对象列表,如果记录不存在的话,它会返回[]。
>>> e3 = Event.objects.filter(name__contains='发布会')
>>> e3
, , ]>

在name 和contains 之间用双下划线。这里,contains 部分会被Django 翻译成LIKE 语句。

  • get查询
>>> g1 = Guest.objects.get(realname='Andy')
>>> g1

4.shell删除数据

删除查询的数据

>>> g2 = Guest.objects.get(realname='Mark')
>>> g2

>>> g2.delete()
(1, {'blog.Guest': 1})

感觉这个有些没有完全删除,通过shell

5.更新数据

直接更新数据即可,记得最后保存数据

>>> from blog.models import Event,Guest
>>> g1 = Guest.objects.get(realname = 'Andy')
>>> g1

>>> g1.realname = 'Allen'
>>> g1

>>>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

你可能感兴趣的:(编程代码学习)