Django简单的数据库交互(mysql)

4 篇文章 0 订阅
4 篇文章 0 订阅

一、数据库的简单交互

首先你需要安装有自己的mysql数据库,此文不做介绍
另外,你需要预设一个空数据库test用于之后的操作
当然,你需要在虚拟环境中安装pymysql

pip install pymysql

在mysql数据库中创建一个空数据库test
1、设置数据库
在setting.py中找到DATABASES字典
在这里插入图片描述
配置为

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',#数据库类型
        'NAME': 'test',#数据库名字
        'USER':'root',#自己数据库用户名
        'PASSWORD':'123',#自己的数据库的密码
        'PORT':'3306'#mysql数据库端口,一般为3306,如果不是请修改
    }
}

2、添加驱动
在命令行输入pip install pymysql安装python的pymysql库
即导入python使用mysql数据库的包pymysql
在项目中找到__init__.py文件
写入代码

import pymysql
pymysql.install_as_MySQLdb()

3、定义表字段
打开项目中的models.py文件
创建如下两个类,表示使用到数据库的表

class AddressInfo(models.Model):
    '''地址表
    类里面的字段代表数据表中的字段(name),数据类型则由CharField(相当于varchar)、DateField(相当于datetime), max_length 参数限定长度'''
    add=models.CharField(max_length=50)
    class Meta:
        #元类
        db_table = 'addressinfo'#定义数据表名称
        verbose_name = '地址管理'#在网页端显示的名字
        verbose_name_plural = verbose_name#去复数形式
    def __str__(self):
        return self.add
class UserInfo(models.Model):
    """ 用户表 """
    name=models.CharField(max_length=20)
    addinfo=models.ForeignKey(AddressInfo)
    #这个是两张表之间的关系,关系写在从表身上,ForeignKey()里面填写的是主表的类名
    class Meta:
        # 元类
        db_table = 'userinfo'
        verbose_name = '用户信息管理'
        verbose_name_plural = verbose_name
    def __str__ (self):
        return self.name

4、数据库迁移
使用命令行在项目目录下执行命令

python manage.py makemigrations
python manage.py migrate

在这里插入图片描述
在这里插入图片描述
完成后打开数据库
在这里插入图片描述
可以看到除了django默认的数据表以外,addressinfo和userinfo表创建完成
5、使用admin管理创建的字段表
将设计的表注册到项目中的admin.py文件中

from user.models import AddressInfo,UserInfo
admin.site.register(UserInfo)
admin.site.register(AddressInfo)

创建超级用户
使用指令python manage.py createsuperuser
在这里插入图片描述
超级用户创建成功,如果忘记密码可以执行命令python manage.py changepassword admin直接修改密码(admin为自定义的用户名)

用浏览器进入http://127.0.0.1:8000/admin/
在这里插入图片描述
在这个可视化页面中可以方便的增删改自定义表单的数据
6、admin页面细节调整
在项目的apps.py文件中可以添加代码
在这里插入图片描述
可以将首页中除django外唯一的英文USER替换为中文,不修改也无伤大雅
在这里插入图片描述

二、django数据库交互语法

对于存在外键的数据表进行修改或者增加操作时,需要写外键的id或者按照外键名获取外键名对应的id
1、基本查询语法
all,get,count,filter

from user.models import UserInfo
data1=UserInfo.bojects.all()#查询所有数据
#返回多个对象

data2=UserInfo.object.get(id=1)#按照指定条件查询
#返回一个符合关键词的单一对象

data3=UserInfo.objects.count()#查询符合条件的数据条数
#返回数据的条数

data4=UserInfo.objects.filter(id_lte=1)#查询多条符合条件的数据
#id_gt=1 id大于1的数据
#id_gte=3 id大于等于3的数据
#id_lt=1 id小于1的数据
#id_lte=1 id小于等于1的数据
#name__startswidth='王' 查找名字字段中带有王的数据

#格式:字段表模型类名.objects.方法()

2、基本的增加语句
方法一:

data1 = AddressInfo(add='北京',)#填写多个字段的数据
data1.save()#完成操作

方法二:

AddressInfo.objects.create(add='北京',)

3、基本删除语句

data1 = AddressInfo.objects.get(add='北京')
data1.delete()#使用任意查询语句后跟.delete()即可删除指定数据

4、基本修改语句
方法一:

data1 = AddressInfo.objects.get(add='北京')
data1.add='上海'#使用任意查询语句后跟列名直接使用等于即可修改
data1.sava()#保存修改

方法二:

AddressInfo.objects.all().update(add='北京')#直接修改,不需要保存修改
AddressInfo.objects.filter(name=name).update(add='北京')#update只能操作对象,get方法获得的字符串则不能使用update方法

三、网页与数据库交互

这里用到tag标签和view方法
使用方法:https://blog.csdn.net/changfcqxhy/article/details/90778848
1、html页面显示数据库返回的数据
html网页

<body>
    <ul>
        {% for obj in data %}
        <li> {{ obj.name }}</li>
        <li> {{ obj.addinfo }}</li>
        {% endfor %}
    </ul>
</body>

添加视图views
此处直接使用all方法查找所有数据

from user.models import UserInfo
def show(request):
    data=UserInfo.objects.all()
    context={'data':data}
    return render(request,'show.html',context)

添加urls

from user import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/$',views.index),
    url(r'^show/$',views.show),
]

运行服务器后打开网址 http://127.0.0.1:8000/show/
在这里插入图片描述
显示成功
2、html页面增加数据库数据
form表单中提交数据可以使用get请求也可以使用post请求
使用get请求时同理,使用正则表达式取出数据即可
这里仅演示使用post请求的方法

html页面
{% csrf_token %}防止csrf错误

<body>
    <form method="POST" action="/adduser/">
   		 {% csrf_token %}
        <sapn>名字</sapn><input type="text" name="name">
        <sapn>地址</sapn><input type="text" name="address">
        <input type="submit" value="提交">
    </form>
</body>

添加视图views

def adduser (request):
    """ 添加用户数据视图 """
    name=request.POST.get('name')#获取post请求返回的名字
    address=request.POST.get('address')#获取post请求返回的地址
    if request.POST.get('name'):#如果返回有数据
        try:
            addinfo=AddressInfo.objects.get(add=address)#试图查找地址
        except:#已有地址中找不到则添加新地址
            addinfo=AddressInfo.objects.create(add=address)#添加新的地址
        UserInfo.objects.create(name=name,addinfo=addinfo)#将用户信息加入到用户表中
    return render(request,'adduser.html')

添加urls

from user import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/$',views.index),
    url(r'^show/$',views.show),
    url(r'^adduser/$',views.adduser),
]

运行服务器之后打开网址 http://127.0.0.1:8000/adduser/
输入如下内容
在这里插入图片描述
提交后,服务器cmd中看到
在这里插入图片描述
成功收到post请求,没有报错,操作成功
在这里插入图片描述
在这里插入图片描述
新地址和新用户添加成功
3、html页面删除数据库数据
html页面

<body>
    {% for obj in test %}
    <h1>{{obj}}</h1>
    {% endfor %}
    <form method="POST" action="/delete/">
        {% csrf_token %}
        <select name="name">
            {% for obj in data %}
            <option value={{ obj.name }}>{{ obj.name }}</option>
            {% endfor %}
        </select>
        <input type="submit" value="提交">
    </form>
</body>

添加视图views

def delete(request):
    '''删除用户数据'''
    def ret(res):
        '''返回的函数'''
        data=UserInfo.objects.all()
        context={'data':data}
        context['test']=[res]#动态输出网页标题
        return render(request,'delete.html',context)
    if request.method=='GET':
        res='请选择要删除的用户数据'
        return ret(res)#get请求直接返回页面
    else:
        name=request.POST.get('name')#获取post请求返回的名字
        UserInfo.objects.get(name=name).delete()#删除对应数据
        res='%s的数据已删除,你可以继续选择要删除的数据'%name
        return ret(res)

添加urls

from user import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/$',views.index),
    url(r'^show/$',views.show),
    url(r'^adduser/$',views.adduser),
    url(r'^delete/$',views.delete),
]

运行服务器之后打开网址 http://127.0.0.1:8000/delete/
这里选择删除老王的数据
在这里插入图片描述
删除成功
在这里插入图片描述
mysql数据库中已经没有老王的数据了
在这里插入图片描述
4、html页面修改数据库数据
html页面

<body>
    <h3>修改密码</h3>
    <form method="POST" action="/cpwd">
        {% csrf_token %}
        <sapn>用户名</sapn><input type="text" name="username">
        <sapn>原密码</sapn><input type="password" name="pwd">
        <sapn>新密码</sapn><input type="password" name="npwd">
        <sapn>确认密码</sapn><input type="password" name="cpwd">
        <input type="submit" value="确认修改">
        
    </form>
</body>

添加视图views

def alert (request):
    """ 修改用户数据 """
    def ret(res):
        '''返回的函数'''
        data=UserInfo.objects.all()
        print('###',data)
        context={'data':data}
        context['test']=[res]#动态输出网页标题
        print('###',context)
        return render(request,'alert.html',context)
    if request.method=='GET':
        res='修改用户地址'
        return ret(res)#get请求直接返回页面
    else:
        name=request.POST.get('name')#获取post请求返回的名字
        address=request.POST.get('address')#获取post请求返回的地址
        res='%s地址已修改为%s'%(name,address)
        try:
            addinfo=AddressInfo.objects.get(add=address)#试图查找地址
        except:
            addinfo=AddressInfo.objects.create(add=address)#添加新的地址
        UserInfo.objects.filter(name=name).update(addinfo=addinfo)#按照用户名修改用户的地址
        return ret(res)

添加urls

from user import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/$',views.index),
    url(r'^show/$',views.show),
    url(r'^adduser/$',views.adduser),
    url(r'^delete/$',views.delete),
    url(r'^alert/$',views.alert),
]

运行服务器之后打开网址 http://127.0.0.1:8000/alert/
修改小王的地址为深圳
在这里插入图片描述
修改完成
在这里插入图片描述
查询数据库

在这里插入图片描述在这里插入图片描述
地址表中增加了深圳这个条目,同时小王的地址id已经修改为深圳代表的4

  • 7
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值