传智播客旗下技术交流社区北京校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

1、选择mysql数据库
在setting中配置:

DATABASES = {

    'default': {

        'ENGINE': 'django.db.backends.mysql',

        'NAME': 'py',    #你的数据库名称

        'USER': 'root',   #你的数据库用户名

        'PASSWORD': '', #你的数据库密码

        'HOST': '', #你的数据库主机,留空默认为localhost

        'PORT': '3306', #你的数据库端口

    }

}

设置完后,再启动我们的Django项目前,我们需要激活我们的mysql。
然后,启动项目,会报错:no module named MySQLdb
这是因为django默认你导入的驱动是MySQLdb,可是MySQLdb对于py3有很大问题,所以我们需要的驱动是PyMySQL
首先我们在终端安装pymysql:

pip install pymysql
1
所以,我们只需要找到项目名文件下的__init__.py,在里面写入:

import pymysql
pymysql.install_as_MySQLdb()

问题解决!

2、定义数据库表以及表之间的关系
我们在这里(modles.py)定义一个学校表School,班级表Class,学号表Number,用户表Userinfo,之间的关系是Sclool与Class 一对多,Userinfo与Class多对多,Number与Userinfo一对一。

from django.db import models

# Create your models here.

class Userinfo(models.Model):
    '''定义数据库表,类名就是表名,max_length相当于varchar,字段格式定义'''
    username = models.CharField(max_length=32,null=True)
    password = models.CharField(max_length=32,null=True)
    specialty = models.CharField(max_length=32, null=True)
    def __str__(self):
        return self.username

#定义学校表
class School(models.Model):
    #blank表示在django可以为空,verbose_name表示在django中的显示
    name = models.CharField(max_length=128,null=True,blank=True,verbose_name='名字')
    #URLField表示在会判断会不会是url,其他形式的也一样其实功能跟上面的一样
    address = models.URLField(max_length=128,null=True,blank=True,verbose_name='地址')
    email = models.EmailField(max_length=128,null=True,blank=True,verbose_name='邮箱')
   # true_false = models.BooleanField(max_length=32,null=True,blank=True,verbose_name='是否')
    date = models.DateField(verbose_name='时间')
    #对应下面的班级表,一对多,可以理解为一个学校可以有多个班级,1对多
    cla = models.ForeignKey(to='Class',default=1)
    def __str__(self):
        return self.name
class Number(models.Model):
    #学号可以11对应,1对1
    num = models.OneToOneField(to='Userinfo',verbose_name='学号')
    def __str__(self):
        return self.num
#定义班级表
class Class(models.Model):
    name = models.CharField(max_length=128, null=True, blank=True, verbose_name='名字')
    #多个班级多个用户,多对多的关系
    user = models.ManyToManyField(to='Userinfo')
    def __str__(self):
        return self.name

初始化表,然后往表里面填充一些数据:

python manage.py makemigrations   
python manage.py migrate

示例数据:
例如学校表:


3、数据库操作 查询
我们通过(views.py中)models.School.objects方法来获取到数据库里面的数据,然后根据条件查询

from django.shortcuts import render,HttpResponse
from bbsAPP import models
# Create your views here.

def list(request):
    school = models.School.objects.all()  #查找全部,拿到的是querset_list 类型
    print ("查找全部。。。")
    for item in school:
        print (item,type(item))
    school = models.School.objects.get(id=1)  #精确查找,拿到的是querset类型,
    print ("精确匹配。。。")
    print (school,type(school),school.name)
    s = models.School.objects.filter(name='清华') #如果models.School.objects.filter.first() 能拿到第一个值,反之last()
    print("查询检索。。。")
    for item in s:  #根据关键字检索,可能会拿到多个值
        print(item,type(item))

    dic = {'name':'清华'}
    #以字典形式传入值来匹配内容
    obj = models.School.objects.filter(**dic).first()
    print ("字典传参形式。。。")
    print (obj,type(obj))
    return HttpResponse('this is list')

得到的结果:
控制台输出:
查找全部。。。
清华 <class ‘bbsAPP.models.School’>
精确匹配。。。
清华 <class ‘bbsAPP.models.School’> 清华
查询检索。。。
清华 <class ‘bbsAPP.models.School’>
字典传参形式。。。
清华 <class ‘bbsAPP.models.School’>

3、数据库操作 增加
增加语法更加精简,通过models.School.objects.create 便可以实现。

from django.shortcuts import render,HttpResponse
from bbsAPP import models
# Create your views here.

def add(request):
    dic={'name':'北大','date':'2018-12-24'}
    obj = models.School.objects.create(**dic)
    print("字典传参形式增加。。。")
    print (obj,type(obj),obj.name)
    obj1 = models.School.objects.create(name='复旦',date='2018-12-24')
    print ('参数赋值形式增加。。。')
    print (obj1, type(obj1), obj1.name)
    return HttpResponse('this is add')

控制台会输出:
字典传参形式增加。。。
北大 <class ‘bbsAPP.models.School’> 北大
参数赋值形式增加。。。
复旦 <class ‘bbsAPP.models.School’> 复旦
数据库对应值,圈住部分为增加:

4、数据库操作 删除
调用models.School.objects.filter 来匹配字段,然后调用delete()方法达到删除的目的

from django.shortcuts import render,HttpResponse
from bbsAPP import models
# Create your views here

def delete(request):
    dic = {'name': '复旦',}
    obj=models.School.objects.filter(**dic).delete()
    print (obj,type(obj))
    return HttpResponse('this is delete')

控制台输出:
其中的数字代表删除的条数
(1, {‘bbsAPP.School’: 1}) <class ‘tuple’>

此时 数据库中的school表中的name为复旦的字段将被删除

4、数据库操作 修改
修改和删除调用的方式类似,只是调用的是update()方法,

from django.shortcuts import render,HttpResponse
from bbsAPP import models
# Create your views here

def update(request):
    dic = {'name': '北大', }
    obj = models.School.objects.filter(**dic).update(name='浙江大学')
    print (obj,type(obj))
    return HttpResponse('this is update')

控制台输出:
1代表修改次数
1 <class ‘int’>
数据库中的字段已经改变为浙江大学

另外的一种修改方式:
这种方式匹配不到值的时候会报错,所以一般不推荐:

obj1 = models.School.objects.get(name='浙江大学')
obj1.name='草鸡大学'
obj1.save()

这种方式也能直接修改数据。


分享至 : QQ空间
收藏

1 个回复

倒序浏览
奈斯,加油
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马