前言:
这几天在做一个外包项目,期间需要用到这个,正好自己也不会,特地来总结,加油!!!
Django的数据库操作
建立一个MODEL
当然,为了方便讲解,我们还是建立一个简单的Model:
from django.db import models
class BookInfo(models.Model):
title = models.CharField(max_length=20, verbose_name='名称')
number = models.IntegerField(default=0, verbose_name='数量')
comment = models.IntegerField(default=0, verbose_name='评论数量')
is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
class Meta:
db_table = 'books'
verbose_name = '图书' # 在管理员admin站点中显示的名称
def __str__(self):
return self.btitle
class StudentInfo(models.Model):
"""
看是男是女
"""
GENDER_CHOICES = (
(0, 'female'),
(1, 'male')
)
class Meta:
db_table = 'students'
verbose_name = '学生'
name = models.CharField(max_length=20, verbose_name='名称')
# default 为缺省值 这点很重要哦!!!
gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')
info = models.CharField(max_length=200, null=True, verbose_name='信息')
book = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书名称') # 外键,不能省略
is_delete = models.BooleanField(default=False, verbose_name='删除')
def __str__(self):
return self.hname
数据库操作(正题)
给数据库中模型增加元素
使用save方法
book=BookInfo(title='高等数学',number='10000',comment='400')
book.save()
上面这个等价于:
book=BookInfo()
book.title = 'xxx'
book.number = 'xxx'
book.comment = 'xxx'
book.save()
使用create方法
StudentInfo.objects.create(name='豪哥哥'gender='1',info='小可爱',book=book)
防止重复创建
🌂:首先尝试获取,不存在就创建,可以防止重复
StudentInfo.objects.get_or_create(name='豪哥哥'gender='1',info='小可爱',book=book)
🌂:最后一种方法返回一个元组,(object, True/False),创建时返回 True, 已经存在时返回 False
数据库内容的修改
使用update方法
当然filter
中的查找条件也可以改为其他的后面会讲解
StudentInfo.objects.filter(info='小可爱').update(info='大可爱')
使用get方法配合save方法
🌂:关于__exact
后面也会讲解的
# 两种方式
stu = StudentInfo.objects.get(gender__exact = 1) # 可以且仅可以返回一条数据。 没有数据或返回多条数据都会抛异常。
stu = StudentInfo.objects.get(gender= 1) # 简写形式 __exact可以省略。返回模型对象
stu.name = "小帅哥"
stu.save()
数据库内容的查询
get函数(上面提了这里不多讲)
(知道get返回一条数据就ok!)
all函数 (查询所有)
students = StudentInfo.objects.all() # 查询所有,返回QuerySet查询集(可以遍历)
迭代用法如下所示:
stu = StudentInfo.objects.all()
for i in stu:
print(i.name)
🌂:多说一点,如果想要知道数据库中有多少条数据,可以使用count
方法
StudentInfo.objects.count()
结果简单来说就是有多少行,很容易理解对吧
filter函数 (条件查询)
属性名称__比较运算符=你要修改的内容
注意了!!!敲重点!!!
属性名称和比较运算符间使用两个
下划线,记住是两个
exact的使用
前面已经提到过,搬运工哈哈哈
# 两种方式
stu = StudentInfo.objects.get(gender__exact = 1) # 可以且仅可以返回一条数据。 没有数据或返回多条数据都会抛异常。
stu = StudentInfo.objects.get(gender= 1) # 简写形式 __exact可以省略。返回模型对象
contains、startswith、endswith(模糊查询)
从单词字面意思可知:
contains
:查询包含"某个值"
statwith
:以什么开头
endswith
:以什么结尾
这里不给例子了
空值查询
🌂:查询学生名不为空的学生名
StudentInfo.objects.filter(title__isnull=False)
返回QuerySet
对象:
<QuerySet [<BookInfo: 豪哥哥>, <BookInfo: 小哥哥>>
比较查询
gt
:大于 (greater then)
gte
:大于等于 (greater then equal)
lt
:小于 (less then)
lte
:小于等于 (less then equal)
随便整一个例子:
BooktInfo.objects.filter(number__gte=200)
exclude函数 (filter函数取反)
查询number不为300的所有图书。
books = BookInfo.objects.exclude(number = 300)
# 与filter函数作用相反
#返回QuerySet查询集(可以遍历)
order_by函数 (排序)
books = BookInfo.objects.all().order_by('-number') # 'id'表示升序; '-number'表示降序。
books = BookInfo.objects.order_by('-number') # 其实.all()可以省略。 默认查询所有。最好还是加上吧!
# 对查询结果进行排序
# 返回QuerySet
暂时到这里吧,觉得基础比较实用的部分!