zoukankan      html  css  js  c++  java
  • 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 = '蛤蟆功')
  • 相关阅读:
    poj2728 Desert King
    bzoj4289 Tax
    洛谷P4141消失之物
    Code Forces 698A Vacations
    Code Forces 543A Writing Code
    洛谷P1133 教主的花园
    poj3177 Redundant Paths
    bzoj1151 动物园
    bzoj1503 郁闷的出纳员
    bzoj1208 宠物收养所
  • 原文地址:https://www.cnblogs.com/kumata/p/9643989.html
Copyright © 2011-2022 走看看