django测试环境搭建/ 单表查询的增删改查/单表查询的关键字/ 神奇的双下划线查询/图书管理系统表设计/正向反向查询/基于双下划线的跨表查询


django测试环境搭建

ps
1、pycharm链接数据库都需要提前下载对应的驱动
2、在带的sqllite3对日期格式数据不敏感
    如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3
    方式一:任意创建一个Py文件,在该文件内书写固定的配置
    import os
    if __name__== '__main__':
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django6.settings")
    import django
    django.setup()
    #单独测试django  py文件
    from app01 import models
    res = models.Books.objects.all()
    print(res)
    方式二:
    直接使用pycharm提供的python console
        from app01 import models
        res = models.Books.objects.all()
        res
        

 单表查询的增删改查

#
    # res = models.Books.objects.create(title='红楼梦',price=999.99)
    # res = models.Books.objects.create(title='西游记',price=888.99)
    # print(res.title)
    # """create返回值就是当前被创建的数据对象"""
#
    # res= models.Books.objects.all()
    # print(res.query)
    #query   查看orm内部对应的SQL语句
    # res = models.Books.objects.filter(title='西游记')
    # print(res)
    # # """filter括号内可以放多个参数  默认是and关系 推荐使用  条件不符合不会报错"""
    # res1 = models.Books.objects.get(title='西游记')
    # print(res1)
    """get括号内可以放多个参数 默认是and关系 不推荐使用  条件不符合会直接报错"""
#
    # res = models.Books.objects.filter(pk=1).update(price=666.66)
    # print(res)  #返回值是受影响的行数
    # book_obj = models.Books.objects.filter(pk=2).first()
    # book_obj.price = 777.77
    # book_obj.save()  #效率低所有的字段重新写一遍
    # """pk能够自动查找当前表的主键字段  我们不需要查看当前表主键的字段名称"""
#
    # models.Books.objects.filter(pk=1).delete()

单表查询的关键字

  • #1、frist()取第一数据对象
  • #2、last()  取最后一个数据对象
# res = models.Books.objects.all().last()
    # print(res)

  •  #3、values() 获取数据指定的字段值
res = models.Books.objects.all().values('title','publish_time')
    # print(res)
# """all()加不加都表示所有的数据  values获取数据结果  类似于列表套子典"""
 

  •  #4、values_list()获取数据指定字段的值
 res = models.Books.objects.values_list('title','publish_time')
    # print(res)
    # """
    # # values_list 获取的结果  类似于列表套元组

  •  5、order_by()排序
res = models.Books.objects.order_by('price')
    # print(res)
    # res = models.Books.objects.order_by('-price')
    # print(res)

  • 6、#count() 计数
 res = models.Books.objects.count()
    print(res)

  •  distinct()去重
res = models.Books.objects.all().distinct()
    # print(res)
    """去重的前提是数据必须一摸一样  一定不能忽略主键"""
  • #8、exclude()排除什么之外
# res = models.Books.objects.exclude(title='西游记')
    # print(res.query)

  • 9、reserve()
  •   
res = models.Books.objects.all()
    # res1 = models.Books.objects.reverse()
    # res2 = models.Books.objects.order_by('price').reverse()
    # print(res)
    # print(res1)
    # print(res2)
# """reserve 需要先排序  然后才能反转"""
 

  • 10、exists() 判断是否有数据 返回布尔值
  •  res = models.Books.objects.all().exists()
        # print(res)


 神奇的双下划线查询

 #查询价格大于700的书籍
    # res = models.Books.objects.filter(price__gt=700)
    # print(res)
    # print(res.query)
    #查询价格小于700的书籍
    # res = models.Books.objects.filter(price__lt=700)
    # print(res)
    # print(res.query)
#     查询价格大于等于700 价格小于等于700
#     res = models.Books.objects.filter(price__gte=700)
#     print(res)
#     res = models.Books.objects.filter(price__lte=700)
#     print(res)
# 查询价格要么是666.666 要么是777.77 要么是999.999 要么是1000
#     res = models.Books.objects.filter(price__in=[666.66,777.77,999.99,1000])
#     print(res)
    """python对数字不是很敏感  精确度不高  很多时候我们会采取字符串存储数字类型"""
#     查询价格再500-800之间得分
#     res = models.Books.objects.filter(price__in=(500,1000))
#     print(res.query)
#模糊查询  查询书名中包含s的
    # res = models.Books.objects.filter(title__contains='s')
    # #忽略大小写
    # res1= models.Books.objects.filter(title__icontains='s')
    # print(res.query)
    # print(res1)
    #查询以什么开头以什么结尾
    # res = models.Books.objects.filter(title__startswith=)
#     查询出版日期是2022的书
#     res = models.Books.objects.filter(publish_time__year=2022)
#     print(res)
# 查询20223月的书
#     res = models.Books.objects.filter(publish_time__month=3)
#     print(res)
    #
    # models.Books.objects.filter(publish_time__year=)

图书管理系统表设计

class Book(models.Model):
    title = models.CharField(verbose_name='书名',max_length=32)
    price = models.DecimalField(verbose_name='价格',max_digits=8,decimal_places=2)
    publish_time = models.DateField(verbose_name='出版日期',auto_now_add=True)
    #一对多  外键字段建在多的一方
    publish = models.ForeignKey(to='Publish')
    #多对多  外键字段推荐建在查询频率较高的表中
    authors = models.ManyToManyField(to='Author')

class Publish(models.Model):
    title =models.CharField(verbose_name='名称',max_length=32)
    addr = models.CharField(verbose_name='地址',max_length=128)
    email= models.EmailField(verbose_name='邮箱')

class Author(models.Model):
    name = models.CharField(verbose_name='姓名',max_length=32)
    age = models.IntegerField(verbose_name='年龄')
    #一对一  外键字段推荐建在查询频率较高的表中
    author_detail = models.OneToOneField(to='AuthorDetail')

class AuthorDetail(models.Model):
    phone = models.BigIntegerField(verbose_name='电话号码')
    addr = models.CharField(verbose_name='地址',max_length=128)
#test.py


#外键字段
    #第一种直接传主键值
    # models.Book.objects.create(title='女娲补天',price=666.99,publish_id=2)
    #第二种传数据
    # publish_obj = models.Publish.objects.filter(pk=1).first()
    # # models.Book.objects.create(title='神雕侠侣',price=234.56,publish=publish_obj)
    #
    # #修改字段值
    # models.Book.objects.filter(pk=1).update(publish_id=2)
    # models.Book.objects.filter(pk=2).update(publish=publish_obj)
#给书绑定作者多对多外键字段
#
    book_obj = models.Book.objects.filter(pk=1).first()
    # book_obj.authors.add(1)  #去第三张关系表中 与作者主键为1的绑定关系
    #作者对象
    # author_obj = models.Author.objects.filter(pk=2).first()
      #去第三张关系表中 与作者主键为1的绑定关系
    # author_obj1 = models.A#
    #
    # book_obj.authors.set([1,2])  #传一个可迭代对象
    # book_obj.authors.set([1,2])  #传一个可迭代对象
    # book_obj.authors.set([1,2])  #传一个可迭代对象

    #
    # book_obj.authors.remove(1,2)
    #清空
    # book_obj.authors.clear()
""""
add()
remove()
括号内即可以传数字也可以传对象  逗号隔开即可
set()
括号内必须传递可迭代对象  可迭代对象内既可以传数字也可以传对象  支持多个
clear()
清空操作  无需传值


"""
"""
作者详情表
作者表
出版社表

书籍表和关系表通过orm实现
"""

正向反向查询

#子查询
"""
1、先查询出一个对象
2、基于对象点正向字段
"""
反向查询表名小写加——set
查询的对象可能有多个的情况查询的对象只有一个的情况不需要加基于对象的跨表查询


#基于对象的正向查询
    #1.查询聊斋书籍对应的出版社
    # book_obj =models.Book.objects.filter(title='聊斋').first()
    # res = book_obj.publish
    # print(res.title)
    # 2.查询神雕侠侣对应的作者
#     book_obj = models.Book.objects.filter(title='女娲补天').first()
#     res = book_obj.authors   #app01.Author.None
#     res = book_obj.authors.all()   #app01.Author.None
#     print(res)
    #3.查询姣姣的地址
    # author_obj = models.Author.objects.filter(name='姣姣').first()
    # res = author_obj.author_detail
    # print(res.phone,res.addr)

    #基于对象的反向查询
    #4.查询东方出版社出版过的书籍
    # publish_obj = models.Publish.objects.filter(title='东方出版社').first()
    #     # res = publish_obj.book_set   #app01.Book.None
    # res = publish_obj.book_set.all()   #app01.Book.None
    # print(res)
    #5.查询康康写过的书
    # authon_obj = models.Author.objects.filter(name='康康').first()
    # res = authon_obj.book_set.all()
    # print(res)
    #6.查询电话是110的作者姓名
    # author_detail_obj = models.AuthorDetail.objects.filter(phone=110).first()
    # res = author_detail_obj.author
    # print(res)
基于双下划线的跨表查询 
############################################
    # 1.查询聊斋书籍对应的出版社名称  正向查询
    # res = models.Book.objects.filter(title='聊斋').values('publish__title')
    # print(res)
    # 2.查询神雕侠侣对应的作者名字和年龄
    # res = models.Book.objects.filter(title='神雕侠侣').values('authors__name','authors__age')
    # print(res)
    # res = models.Author.objects.filter(name='姣姣').values('author_detail__addr')
    # print(res)
    #基于双下划线的反向查询
    #1、查询聊斋书籍对应的出版社名称
    # res = models.Publish.objects.filter(book__title='聊斋').values('title')
    # print(res)
# # 2.查询神雕侠侣对应的作者名字和年龄
#     res  =models.Author.objects.filter(book__title='神雕侠侣').values('name','age')
#     print(res)
# #3.查询姣姣的地址
#     res = models.AuthorDetail.objects.filter(author__name='姣姣').values('addr')
#     print(res)
#查询神雕侠侣作者的电话和地址
    # res = models.Book.objects.filter(title='神雕侠侣').values('authors__author_detail__phone','authors__author_detail__addr')
    # print(res)
    # res = models.Author.objects.filter(book__title='神雕侠侣').values('author_detail__phone','author_detail__addr')
    # print(res.query)