Django----模型----数据库的基本操作

Posted 映辉博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django----模型----数据库的基本操作相关的知识,希望对你有一定的参考价值。

1、添加记录

方式一:save()

方式二(推荐):create()

 

2、查询记录

(1)all()

 

查询所有记录,返回queryset对象。
stu_list = Student.objects.all()

 

 

(2)filter()

查询符合条件的对象,返回queryset对象。
stu_list = Student.objects.filter(name = "yuan",age = 22)

 

(3)get()

返回与所给筛选条件相匹配的对象,返回结果有且只有一个, 如果符合筛选条件的对象超过一个或者没有都会抛出错误。返回模型类对象。

student = Student.objects.get(pk=104)

  

(4)first() 和 last()

分别为查询集的第一条记录和最后一条记录,返回模型类对象。
# 没有结果返回none,如果有多个结果,则返回模型对象

student = Student.objects.filter(name="刘德华").first()

  

(5)order_by()

对查询结果排序,返回queryset对象

 

# order_by("字段")  # 按指定字段正序显示,相当于 asc  从小到大
# order_by("-字段") # 按字段倒序排列,相当于 desc 从大到小
# order_by("第一排序","第二排序",...)

 

  

student_list = Student.objects.filter(classmate="301").order_by("-age").all()
student_list = Student.objects.filter(classmate="301").order_by("age").all() #正序
student_list = Student.objects.filter(classmate="301").order_by("-age","id").all() # 年龄倒序,年龄一致按id进行正序

  

(6)exclude()

筛选条件不匹配的对象

 

(7)count()

查询集中对象的个数,计数

ret = Student.objects.filter(classmate="301").count()

  

(8)exists()

判断查询集中是否有数据,如果有则返回True,没有则返回False

 

(9)values()  /  values_list()

 

(10)distinct()

去重

 

(11)contains

说明:如果要包含%无需转义,直接写即可

# 查询姓名包含 华 的学生
Student.objects.filter(name__contains=\'华\')

  

(12)startswith  /  endswith

查询姓名以’文’结尾的学生:
Student.objects.filter(name__endswith=\'文\')


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

  

(13)isnull

找出所有时间为空的数据:

 

找出时间不为空的数据:

 

(14)in

查询编号为1或3或5的学生:
Student.objects.filter(id__in=[1, 3, 5])

  

(15)比较查询

 

查询编号大于3的学生:
Student.objects.filter(id__gt=3)

 

(16)日期查询

year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算:

 

(17)F 查询

之前的查询都是对象的属性与常量值比较,两个属性怎么比较呢? 答:使用F对象,被定义在django.db.models中。


语法:

"""F对象:2个字段的值比较"""
from django.db.models import F
# SQL: select * from db_student where created_time=updated_time;
student_list = Student.objects.filter(created_time=F("updated_time"))

  

(18)Q 查询

查询年龄大于20,并且编号小于30的学生:
Student.objects.filter(age__gt=20,id__lt=30)

或:

Student.objects.filter(age__gt=20).filter(id__lt=30)

  

如果需要实现逻辑或or的查询,需要使用Q()对象结合|运算符,Q对象被义在django.db.models中。
语法:
Q(属性名__运算符=值)
Q(属性名__运算符=值) | Q(属性名__运算符=值)

  

查询年龄小于19或者大于20的学生,使用Q对象如下:
from django.db.models import Q

student_list = Student.objects.filter( Q(age__lt=19) | Q(age__gt=20) ).all()

  

Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或
查询年龄大于20,或编号小于30的学生,只能使用Q对象实现:
Student.objects.filter(Q(age__gt=20) | Q(pk__lt=30))

  

Q对象左边可以使用~操作符,表示非not。
查询编号不等于30的学生:
Student.objects.filter(~Q(pk=30))

  

(19)聚合查询

使用aggregate()过滤器调用聚合函数。

聚合函数包括:Avg 平均,Count 数量,Max 最大,Min 最小,Sum 求和,被定义在django.db.models中。

查询学生的平均年龄:
from django.db.models import Sum,Count,Avg,Max,Min

Student.objects.aggregate(Avg(\'age\'))

  

注意:aggregate的返回值是一个字典类型,格式如下:

  \'属性名__聚合类小写\':

 

(20)分组查询

 

(21)原生查询

执行原生SQL语句, 直接跳过模型,   用原生pymysql操作

ret = Student.objects.raw("SELECT id,name,age FROM tb_student")  

# student 可以是任意一个模型
# 这样执行获取的结果无法通过QuerySet进行操作读取,只能循环提取

for item in ret:
    print(item)

  

3、删除记录

方式1:模型类对象.delete()

student = Student.objects.get(id=13)
student.delete()

  

方式2:模型类.objects.filter().delete()

 

 

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

 

  

4、修改记录

方式1:使用save()保存更新数据

 

方式2(推荐):update()

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

 

 

 

django的模型类管理器-----------数据库操作的封装

模型实例方法

  • str():在将对象转换成字符串时会被调用。
  • save():将模型对象保存到数据表中,ORM框架会转换成对应的insert或update语句。
  • delete():将模型对象从数据表中删除,ORM框架会转换成对应的delete语句。

 

模型类的属性

属性objects:管理器,是Manager类型的对象,用于与数据库进行交互。

当没有为模型类定义管理器时,Django会为模型类生成一个名为objects的管理器,自定义管理器后,Django不再生成默认管理器objects。

 

管理器是Django的模型进行数据库操作的接口,Django应用的每个模型都拥有至少一个管理器。Django支持自定义管理器类,继承自models.Manager。

 

自定义管理器类主要用于两种情况:

  • 1.修改原始查询集,重写all()方法
  • 2.向管理器类中添加额外的方法,如向数据库中插入数据。

 

1.修改原始查询集,重写all()方法。

#图书管理器
class BookInfoManager(models.Manager):
    def all(self):
        #默认查询未删除的图书信息
        #调用父类的成员语法为:super().方法名
        return super().all().filter(isDelete=False)

 

b)在模型类BookInfo中定义管理器

class BookInfo(models.Model):
    ...
    books = BookInfoManager()

 

2.在管理器类中定义创建对象的方法

当创建模型类对象时,django不会对数据库进行读写操作,调用save()方法才与数据库交互,进行insert或update操作,将数据保存到数据库中。如果模型类的属性比较多,逐个属性赋值很麻烦,推荐使用管理器

class BookInfoManager(models.Manager):
    ...
    #创建模型类,接收参数为属性赋值
    def create_book(self, title, pub_date):
        #创建模型类对象self.model可以获得模型类
        book = self.model()
        book.btitle = title
        book.bpub_date = pub_date
        book.bread=0
        book.bcommet=0
        book.isDelete = False
        # 将数据插入进数据表
        book.save()
        return book

 

b)为模型类BookInfo定义管理器books语法如下

class BookInfo(models.Model):
    ...
    books = BookInfoManager()

 

c)调用语法如下:

调用:book=BookInfo.books.create_book("abc",date(1980,1,1))

 

以上是关于Django----模型----数据库的基本操作的主要内容,如果未能解决你的问题,请参考以下文章

Django 07. django框架模型之增删改查基本操作

Django---MTV模型基本命令简单配置

Django框架——模型(数据库操作)

Django4模型(操作数据库)

Django模型层之单表操作

Django项目的ORM操作之--模型类数据查询