Django:模型(model)和数据库(mysql)

Posted kumata

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django:模型(model)和数据库(mysql)相关的知识,希望对你有一定的参考价值。

以一个栗子尝试来记录:

两个表存储在数据库中,BookInfo表示书,HeroInfo表示人物。一本书中有多个人物

mysql中新建一个数据库Django1,不用创建表,用Django模型来配置数据库

1、数据库ER图

技术分享图片

2、数据库配置

在settings.py中进行数据库的配置。

留意:django默认连接的是sqlite3数据库。我们需要修改成MySQL

django1/settings.py

DATABASES = {
    ‘default‘: {
        ‘ENGINE‘: ‘django.db.backends.mysql‘,
        ‘NAME‘: ‘django1‘,
        ‘USER‘: ‘root‘,
        ‘PASSWORD‘: ‘123‘,
        ‘HOST‘: ‘localhost‘,
        ‘PORT‘: ‘3306‘
    }
}

PS:

在Python3中用MySQLdb连接MySQL会猜到一个坑:MySQLdb 只适用于python2.x,发现pip装不上。它在py3的替代品是:import pymysql

而Django默认的还是使用MySQLdb:执行会报:ImportError: No module named ‘MySQLdb‘

以下为安装MySQLdb的解决方法:

方法一:安装mysqlclient 1.3.10版本

pip install mysqlclient==1.3.10

方法二:

在站点的 __init__.py 文件中添加

import pymysql
pymysql.install_as_MySQLdb()

3、创建应用

在一个工程里面可以创建多个应用(app)。每个应用对应一种业务

# 创建应用的命令
python manage.py startapp booktest

 

 执行后,多了一个booktest目录。该目录就是这个应用所在的目录。

 

4、定义模型类

通过定义模型类去生成数据库。而不是直接写数据库的表

模型类需要继承django.db.models.Model

注意:在模型类中,不需要定义PK(主键)的

当输出对象的时候,系统会调用__str__()方法(描述对象本身)

booktest/models.py

from django.db import models

# Create your models here.

class BookInfo(models.Model):
    # 设置字段
    btitle = models.CharField(max_length = 20)
    bpub_date = models.DateTimeField()

    def __str__(self):
        return self.btitle

class HeroInfo(models.Model):
    # 设置字段
    hname = models.CharField(max_length = 10)
    hgender = models.BooleanField()
    hcontent = models.CharField(max_length = 1000)
    hbook = models.ForeignKey(BookInfo, on_delete = models.CASCADE)

    def __str__(self):
        return self.hname

5、启动服务器

在命令行输入

# 表示启动django服务器,默认使用8000端口
python manage.py runserver

# 使用8080作为端口
python manage.py runserver 8080

然后通过浏览器端访问 http://127.0.0.1:8080/

看到django已经成功启动后,此时数据库django1中多了一个表django_miggrations

6、生成数据库的表

首先需要激活模型,编辑settings.py文件,在INSTALLED_APPS加上应用的名称(booktest)

django1/settings.py

INSTALLED_APPS = (
    django.contrib.admin,
    django.contrib.auth,
    django.contrib.contenttypes,
    django.contrib.sessions,
    django.contrib.messages,
    django.contrib.staticfiles,
    booktest
)

然后生成迁移文件,在命令行输入

# 然后生成迁移文件,在命令行输入
python manage.py makemigrations

# 此时在booktest目录下生成子目录migrations,里面有0001_initial.py
# 0001_initial.py里面系统会主动帮我们的表生成id字段

# 执行迁移,执行SQL语句生成数据库
python manage.py migrate

随后刷新数据库就能在一堆表里看到 booktest_bookinfobooktest_heroinfo 两个表啦

7、测试数据操作

# 进入django的shell
python manage.py shell

# 进行简单的测试(带有django项目的一些配置)导入相关的包
from booktest.models import BookInfo, HeroInfo
from django.utils import timezone
from datetime import *

# 查询所有书的信息
BookInfo.objects.all()

# 新建一本书的信息
b = BookInfo()
b.btitle = 射鸟英雄传
b.bpub_date = datetime(year = 2018, month = 8, day = 11)
b.save()

# 查询某本书的信息
b1 = BookInfo.objects.get(pk = 1)
b1.id  
b1.btitle
b1.bpub_date

# 删除书
b1.delete()

# 获取关联集合:(与书有关的所有人物)
b.heroinfo_set.all()

# 创建关联的数据,不用save()都Ok
b.heroinfo_set.create(hname=欧阳疯, hgender=False, hcontent = 蛤蟆功)

 


以上是关于Django:模型(model)和数据库(mysql)的主要内容,如果未能解决你的问题,请参考以下文章

Django-1.11中文文档-模型Models

Django:模型(model)和数据库(mysql)

django项目模型字段

Django模型

Django模型类之models字段类型和参数以及元数据meta

Django:模型(model)和数据库(mysql)