django中关于数据库的操作总集

本文详细介绍了Django ORM的基本操作,包括字段设置、数据获取、条件筛选、数据排序及聚合查询等内容,帮助读者掌握Django数据库操作的核心技巧。

django中设置mysql字段的方法:

    id = models.AutoField(primary_key=True)
 # id 会自动创建,可以手动写入,一般不需要设置,因为项目本身就会给其创建id字段

    title = models.CharField(max_length=32) # 创建一个最大输入长度为32个字符的字段

    price = models.DecimalField(max_digits=5, decimal_places=2) 
# 创建一个可接受最大长度为五位数的数值,且设置其保留位数为两个小数点

    pub_date = models.DateField() # 创建一个用于接收日期的字段

    hgender=models.BooleanField(default=False)
#BooleanField说明是bool类型,default指定默认值为False

    hbook=models.ForeignKey(to="BookInfo",on_delete=models.CASCADE)

    body = models.TextField('内容', null=True, blank=True)
# 设置一个文本字段,允许为空

获取数据:

Django提供了多种方式来获取数据库的内容,如下代码所示:

    # 获取单个对象,如果符合筛选条件的对象超过了一个或者没有一个都会抛出错误。
    re3 = Test.objects.get(id=1)  
    ''' 获取 id 字段为1的那一行数据信息。返回的是对象。可通过 .字段名 来获取字段内容'''
    # 返回的东西:Testobject(1) 
    # 限制返回的数据 相当于 切片
    re4 = Test.objects.order_by('name')[0:2]  
''' 获取 name 字段前两行的信息内容。返回的是列表形式,可通过获取列表值加 .字段名 
的方式获取指定字段的内容'''
    # 返回的格式:< QuerySet[ < Test: Testobject(1) >, < Test: Testobject(8) >] >

    # 数据排序 order_by() 方法用于对查询结果进行排序。降序为在字段前面加个负号 -。
    re5 = Test.objects.order_by("name")  
''' 获取的是按指定字段进行排序后的所有行信息。从小到大。返回的是列表形式,
可通过获取列表值加 .字段名 的方式获取指定字段的内容'''
    # 返回的格式:< QuerySet[ < Test: Testobject(1) >, < Test: Testobject(7) >, < Test: Testobject(8) >] >

    books = models.Book.objects.order_by("-price").reverse() 
 ''' reverse() 方法用于对查询结果进行反转。'''

    # 获得所有数据行,相当于SQL中的  --   select * from 表名;
    re1 = Test.objects.all()  
    ''' 获得这个表的全部信息内容,返回的是列表形式,可通过获取列表值加 .字段名 的方式获取指定字段的内容'''
    # 返回的格式:< QuerySet[ < Test: Testobject(1) >, < Test: Testobject(7) >, < Test: Testobject(8) >] >

    ''' filter相当于SQL中的WHERE,可设置条件过滤结果  -- select * from value2 where name = "my one";
   //返回value2表下name字段的值为 "my one"的那一行数据'''
    re2 = Test.objects.filter(id=1)  
    ''' 获取 id 字段为1的那一行数据信息。返回的是列表形式,可通过获取列表值加 .字段名 的方式获取指定字段的内容'''
    # 返回的格式: < QuerySet[ < Test: Testobject(1) >] >

    ''' 所有的方法都可以连锁使用  :获取name字段内容为1的数据,在以id为序列进行排序。
    返回的是列表形式,可通过获取列表值加 .字段名 的方式获取指定字段的内容 '''
    re6 = Test.objects.filter(name='1').order_by("id")  # 连续使用筛选出符合条件的数据行。
    # 返回的格式:< QuerySet[ < Test: Testobject(1) >, < Test: Testobject(8) >] >
''' exclude() 方法用于查询不符合条件的数据。获取lish字段不为 1 和价格不为300的字段内容 '''
books = models.Book.objects.exclude(lish='社', price=300)  

''' count() 方法用于查询数据的数量返回的数据是整数。'''
books = models.Book.objects.count() # 查询所有数据的数量  
books = models.Book.objects.filter(price=200).count() # 查询符合条件数据的数量
books = models.Book.objects.first() # 返回所有数据的第一条数据
books = models.Book.objects.last() # 返回所有数据的最后一条数据
'''exists() 方法用于判断查询的结果 QuerySet 列表里是否有数据。
返回的数据类型是布尔,有为 true,没有为 false。
注意:判断的数据类型只能为 QuerySet 类型数据,不能为整型和模型类的对象。'''
    ''' 
        books = models.Book.objects.exists()
        # 报错,判断的数据类型只能为QuerySet类型数据,不能为整型
        books = models.Book.objects.count().exists()
        # 报错,判断的数据类型只能为QuerySet类型数据,不能为模型类对象
    '''
values() 方法用于查询部分字段的数据。
    # 查询所有的id字段和price字段的数据
    books = models.Book.objects.values("pk","price")

values_list() 方法用于查询部分字段的数据。
    # 查询所有的price字段和publish字段的数据,返回的数据为元组形式
    books = models.Book.objects.values_list("price","publish")
distinct() 方法用于对数据进行去重。
''' 对模型类的对象去重没有意义,因为每个对象都是一个不一样的存在。'''
distinct() 一般是联合 values 或者 values_list 使用。
    books = models.Book.objects.values_list("publish").distinct()  # 查询一共有多少个出版社
''' 查询所有出版社内容,对其进行去重操作 '''
filter() 方法基于双下划线的模糊查询(exclude 同理)。
注意:filter 中运算符号只能使用等于号 = ,不能使用大于号 > ,小于号 < ,等等其他符号。

books = models.Book.objects.filter(price__in=[200,300])    # 查询价格为200或者300的数据
books = models.Book.objects.filter(price__gt=200)# 查询价格大于200的数据
books = models.Book.objects.filter(price__gte=200)# 查询价格大于等于200的数据
books=models.Book.objects.filter(price__lt=300)# 查询价格小于300的数据
books=models.Book.objects.filter(price__lte=300)# 查询价格小于等于300的数据
books=models.Book.objects.filter(price__range=[200,300]) # 查询价格在200-300之间的数据
books=models.Book.objects.filter(title__contains="菜") #查询title中有菜的数据,将其返回
books=models.Book.objects.filter(title__startswith="菜") # 查询以指定字符开头的数据
books=models.Book.objects.filter(title__endswith="教程") # 查询以指定字符结尾的数据
books=models.Book.objects.filter(title__icontains="python") # 不区分大小写
books=models.Book.objects.filter(date__year=2008) # 查询指定年份的数据
books=models.Book.objects.filter(pub_date__month=10) # 查询指定月份的数据
books=models.Book.objects.filter(pub_date__day=01)# 查询指定日的数据

更新/修改字段数据:

    # 修改其中一个id=1的name字段,再save,相当于SQL中的 update admin set pass="ad" where id = 1;  // 修改admin表内id字段为 1 的那行数据内的pass的值
    test1 = Test.objects.get(id=1)
    test1.name = 'Google'  # 获取id为1的那行数据返回对象形式,将其指定字段名的内容改为 'Google'
    test1.save()  # 传入SQL 内执行SQL语句
    
    # 另外一种方式
    Test.objects.filter(id=2).update(name='Google')  # 获取id=2,的数据行,将其的name字段内容改为指定内容
    
    # 修改所有的列
    Test.objects.all().update(name='Google')  # 获取所有行数据。修改他们的name字段内容为指定内容

创建数据:

 books = models.Book.objects.create(title="如来神掌",price=200,publish="功夫出版社",pub_date="2010-10-10")
''' 将指定内容插入指定字段内'''

删除数据:

    # 删除id=1的数据
    test1 = Test.objects.get(id=1)  # 获取id=1的数据
    test1.delete()  # 将其删除
    
    # 另外一种方式
    # Test.objects.filter(id=1).delete()  # 获取id=1的数据将其删除
    
    # 删除所有数据
    # Test.objects.all().delete()  # 获取所有数据行,并将其删除


    # models.Book.objects.filter(pk__in=[1,2]).delete() # 删除1-2这个范围内的主键的数据
    ''' Django 删除数据时,会模仿 SQL约束 ON DELETE CASCADE 的行为,
    也就是删除一个对象时也会删除与它相关联的外键对象。'''

 ORM还提供了特殊的数据查询方法:
从 django.db.models 引入 Avg、Max、Min、Count、Sum(首字母大写)。

使用 aggregate() 后,数据类型就变为字典,不能再使用 QuerySet 数据类型的一些 API 了。

from django.db.models import Avg,Max,Min,Count,Sum  #   引入函数
res = models.Book.objects.aggregate(Avg("price"))  # 求价格的平均值,最后将值传到字典内返回

res=models.Book.objects.aggregate(c=Count("id"),max=Max("price"),min=Min("price"))
'''
c=Count('id') :求这个表内有多少id字段,最后将值赋给key名为c的字典值
max=Max('price') :求这个表中 price 字段中最大的值。最后将值赋给key名为max的字典值
min=Min('price') :求这个表中 price 字段中最小的值,最后将值赋给key名为mix的字典值
'''
res = models.Publish.objects.values("name").annotate(in_price = Min("book__price"))
# 获取name字段中,book_price 最小的值,将其赋值给key名为 in_price 的value值。

res = models.Book.objects.annotate(c = Count("authors__name")).values("title","c")
# 统计每一本书的作者个数.

res = models.Book.objects.filter(title__startswith="菜").annotate(c = Count("authors__name")).values("title","c")
# 统计每一本以"菜"开头的书籍的作者个数.

res = models.Book.objects.annotate(c = Count("authors__name")).filter(c__gt=0).values("title","c")
# 统计不止一个作者的图书名称.

res = models.Book.objects.annotate(c = Count("authors__name")).order_by("-c").values("title","c")
# 根据一本图书作者数量的多少对查询集 QuerySet 进行降序排序.

res = models.Author.objects.annotate(all = Sum("book__price")).values("name","all")
#查询各个作者出的书的总价格.

F() 查询

之前构造的过滤器都只是将字段值与某个常量做比较,如果想要对两个字段的值做比较,就需要用到 F()。

使用前要先从 django.db.models 引入 F:

from django.db.models import F

Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取余的操作。

修改操作(update)也可以使用 F() 函数。

from django.db.models import F
F("字段名称")
book=models.Emp.objects.filter(salary__gt=F("age")).values("name","age")
# 获取薪资大于 age 字段内容的信息,返回他们的 name 字段和 age 字段的值。


res = models.Book.objects.update(price=F("price")+100) # 将每一本书的价格提高100元:

Q() 查询

之前构造的过滤器里的多个条件的关系都是 and,如果需要执行更复杂的查询(例如 or 语句),就可以使用 Q 。

Q 对象可以使用 & | ~ (与 或 非)操作符进行组合。

优先级从高到低:~ & |。

可以混合使用 Q 对象和关键字参数,Q 对象和关键字参数是用"and"拼在一起的(即将逗号看成 and ),但是 Q 对象必须位于所有关键字参数的前面。

from django.db.models import Q
Q(条件判断)

res=models.Book.objects.filter(Q(price__gt=350)|Q(title__startswith="菜")).values("title","price")
# 查询价格大于 350 或者名称以菜开头的书籍的名称和价格。


# 查询以"菜"结尾或者不是 2010 年 10 月份的书籍:
res = models.Book.objects.filter(Q(title__endswith="菜") | ~Q(Q(pub_date__year=2010) & Q(pub_date__month=10)))

# 查询出版日期是 2004 或者 1999 年,并且书名中包含有"菜"的书籍。
# Q 对象和关键字混合使用,Q 对象要在所有关键字的前面:
res = models.Book.objects.filter(Q(pub_date__year=2004) | Q(pub_date__year=1999), title__contains="菜")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值