Django中mysql数据库的增删改查

一、增加
1) save:通过创建模型类对象,执行对象的save()方法保存到数据库中。
例如:

In [1]: from demo_class.models import BookInfo
In [2]: from datetime import date
In [3]: from demo_class.models import HeroInfo
In [4]: book = BookInfo(btitle = 'wang',bpub_date = date(1990,10,10))
In [5]: book.save()

2)create():通过模型类.objects.create()保存。

In [11]: HeroInfo.objects.create(
    ...: hname = '沙悟净',
    ...: hgender = 0,
    ...: hbook = book
    ...: )
Out[11]: <HeroInfo: 沙悟净>

二、查询
1.基本查询

all 方法返回所有数据

In [12]: BookInfo.objects.all()
Out[12]: <QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 笑傲江湖>雪山飞狐>, <BookInfo: 西游记>, <BookInfo: wang>, <BookInfo: wang>]>

get 查询单一结果,如果不存在会抛出模型类.DoesNotExist异常。

In [13]: BookInfo.objects.get(id = 3)
Out[13]: <BookInfo: 笑傲江湖>
In [14]: BookInfo.objects.get(id = 100)
DoesNotExist: BookInfo matching query does not exist.

count 查询结果数量。

In [15]: BookInfo.objects.count()
Out[15]: 7

2.过滤查询

*filter 过滤出多个结果
exclude 排除掉符合条件剩下的结果
get 过滤单一结果*
过滤条件的表达语法如下:
**属性名称__比较运算符=值
属性名称和比较运算符间使用两个下划线,所以属性名不能包括多个下划线**

对于过滤条件的使用,上述三个方法相同,故仅以filter进行讲解。

In [17]: BookInfo.objects.filter(id__in = [1,2,3,4])
Out[17]: <QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 笑傲江湖>雪山飞狐>]>

1)相等
exact:表示判等。
例:查询编号为2的图书。

BookInfo.objects.filter(id__exact=2)
# 可简写为:
BookInfo.objects.filter(id=1)

2)模糊查询
contains:是否包含。
说明:如果要包含%无需转义,直接写即可。
例:查询书名包含’传’的图书。

BookInfo.objects.filter(btitle__contains='传')

startswith、endswith:以指定值开头或结尾。
例:查询书名以’部’结尾的图书

BookInfo.objects.filter(btitle__endswith='部')

以上运算符都区分大小写,在这些运算符前加上i表示不区分大小写,如iexact、icontains、istartswith、iendswith.

3) 空查询
isnull:是否为null。
例:查询书名不为空的图书。

BookInfo.objects.filter(btitle__isnull=False)

4) 范围查询
in:是否包含在范围内。
例:查询编号为1或3或5的图书

BookInfo.objects.filter(id__in=[1, 3, 5])

5)比较查询
gt 大于 (greater then)
gte 大于等于 (greater then equal)
lt 小于 (less then)
lte 小于等于 (less then equal)
例:查询编号大于3的图书

BookInfo.objects.filter(id__gt=3)

不等于的运算符,使用exclude()过滤器。
例:查询编号不等于3的图书

BookInfo.objects.exclude(id=3)

6)日期查询
year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。
例:查询1980年发表的图书。

BookInfo.objects.filter(bpub_date__year=1980)

例:查询1980年1月1日后发表的图书。

BookInfo.objects.filter(bpub_date__gt=date(1990, 1, 1))

3.F对象
使用F对象对两个属性进行比较,被定义在django.db.models中
语法如下:
F(属性名)
例:查询阅读量大于等于评论量的图书

from django.db.models import F
# 阅读量大于等于评论量
BookInfo.objects.filter(bread__gte=F('bcomment'))

可以在F对象上使用算数运算BookInfo.objects.filter(bread__gt=F('bcomment') * 2)
4.Q对象
多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字
例:查询阅读量大于20,并且编号小于3的图书

BookInfo.objects.filter(bread__gt=20,id__lt=3)
# 或
BookInfo.objects.filter(bread__gt=20).filter(id__lt=3)

如果需要实现逻辑或or的查询,需要使用Q()对象结合|运算符,Q对象被义在django.db.models中。
语法如下:
.Q(属性名__运算符=值)
例:查询阅读量大于20的图书,改写为Q对象如下

from django.db.models import Q
BookInfo.objects.filter(Q(bread__gt=20))

Q对象可以使用&、|连接,&表示逻辑与,|表示或,~表示非
例:查询阅读量大于20,或编号小于3的图书,只能使用Q对象实现

# 查询id=1,2,3**或**书名为西游记
BookInfo.objects.filter(Q(id__in = [1,2,3]) | Q(btitle = '西游记'))

查询编号不等于3的图书

BookInfo.objects.filter(~Q(pk=3))

5.聚合函数
使用aggregate()过滤器调用聚合函数
例:查询图书的总阅读量。

In [14]: from django.db.models import Sum
In [15]:BookInfo.objects.aggregate(Sum('bread'))
Out[15]: {'bread__sum': 136}
# 输出字典数据

6.排序

BookInfo.objects.all().order_by('bread')  # 升序
BookInfo.objects.all().order_by('-bread')  # 降序

7.关联查询
一对多:
一对应的模型类对象.多对应的模型类名小写_set
例:

# 获取id为1的图书下的所有英雄的信息
b = BookInfo.objects.get(id=1)
b.heroinfo_set.all()

多对一
多对应的模型类对象.多对应的模型类中的关系类属性名
例:

h = HeroInfo.objects.get(id=1)
h.hbook

访问一对应的模型类关联对象的id语法:
多对应的模型类对象.关联类属性_id
例:

h = HeroInfo.objects.get(id=1)
h.hbook_id

关联过滤查询
关联模型类名小写_属性名_条件运算符=值
如果没有”__运算符”部分,表示等于
查询图书中有‘孙悟空’名字的图书名称

BookInfo.objects.filter(heroinfo__hname='孙悟空')

查询书名为“天龙八部”中的所有英雄。

HeroInfo.objects.filter(hbook__btitle='天龙八部')

三、修改
修改更新有两种方法
1)save
修改模型类对象的属性,然后执行save()方法

hero = HeroInfo.objects.get(hname='猪八戒')
hero.hname = '猪悟能'
hero.save()

2)update
使用模型类.objects.filter().update(),会返回受影响的行数

HeroInfo.objects.filter(hname='沙悟净').update(hname='沙僧')

删除
删除有两种方法

1)模型类对象delete

hero = HeroInfo.objects.get(id=13)
hero.delete()

2)模型类.objects.filter().delete()

HeroInfo.objects.filter(id=14).delete()

注意:实际开发中一般不用这种物理删除,常用逻辑删除,例如:

book = BookInfo.objects.get(id =1 )
book.is_delete = True
book.save()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现连接虚拟机Django+MySQL并进行增删改查,需要以下步骤: 1. 确保虚拟机DjangoMySQL已经正确安装并启动。 2. 在Django创建一个可以进行数据库操作的应用程序,在应用程序创建模型类,定义好需要操作的字段。 3. 在MySQL创建相应的数据库和表,与Django定义的模型类对应。 4. 在Django配置数据库连接,可以在settings.py进行配置。 5. 在Django编写视图函数,实现增删改查功能。 6. 在app编写前端界面,通过ajax等方式调用Django的视图函数进行数据操作。 具体实现过程可以参考以下步骤: 1. 在虚拟机启动Django,并创建一个应用程序,例如命名为myapp。 2. 在myapp创建一个模型类,代码如下: ```python from django.db import models class User(models.Model): name = models.CharField(max_length=20) age = models.IntegerField() ``` 3. 在MySQL创建一个名为mydb的数据库,并在其创建一个名为user的表,代码如下: ```mysql CREATE DATABASE mydb; USE mydb; CREATE TABLE user ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(20) NOT NULL, age INT NOT NULL, PRIMARY KEY (id) ); ``` 4. 在Django的settings.py配置MySQL连接,代码如下: ```python DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mydb', 'USER': 'username', 'PASSWORD': 'password', 'HOST': 'localhost', 'PORT': '3306', } } ``` 其,username和password需要替换为MySQL的用户名和密码。 5. 在myapp编写视图函数,可以实现增删改查功能,代码如下: ```python from django.shortcuts import render, HttpResponse from .models import User def add_user(request): if request.method == 'POST': name = request.POST.get('name') age = request.POST.get('age') user = User(name=name, age=age) user.save() return HttpResponse('success') def delete_user(request, id): user = User.objects.get(id=id) user.delete() return HttpResponse('success') def update_user(request, id): if request.method == 'POST': name = request.POST.get('name') age = request.POST.get('age') user = User.objects.get(id=id) user.name = name user.age = age user.save() return HttpResponse('success') def get_user(request, id): user = User.objects.get(id=id) return HttpResponse(f'name: {user.name}, age: {user.age}') ``` 其,add_user函数为添加用户,delete_user函数为删除用户,update_user函数为更新用户信息,get_user函数为获取用户信息。 6. 在app编写前端界面,通过ajax等方式调用Django的视图函数进行数据操作。 例如,添加用户的前端界面可以编写如下代码: ```html <form> <label for="name">name:</label> <input type="text" id="name" name="name"><br><br> <label for="age">age:</label> <input type="text" id="age" name="age"><br><br> <input type="submit" value="Submit" onclick="addUser()"> </form> <script> function addUser() { var name = document.getElementById("name").value; var age = document.getElementById("age").value; var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (xhr.readyState == XMLHttpRequest.DONE) { if (xhr.status == 200) { alert('success'); } else { alert('error'); } } } xhr.open('POST', '/add_user/', true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.send("name=" + name + "&age=" + age); } </script> ``` 其,addUser函数通过ajax调用Django的add_user视图函数,将输入的name和age值传递给Django进行添加操作。 其他操作的前端界面类似,只需要调用不同的视图函数即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值