zoukankan      html  css  js  c++  java
  • django框架之 Django ORM操作

    如果想要在django项目中运行py文件,就要在新建的py文件下添加:

    
    
    import os
    if __name__ == "__main__":
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "untitled4.settings")
        import django
        django.setup()
    这样就可以在这样就可以在django项目中运行py文件了。
    先在models写自己的类,然后再py文件中引入就可以了。
    我们在models创建这么几个类:
    from django.db import models
    
    # Create your models here.
    class  Person(models.Model):
        name = models.CharField(max_length=32)
        age = models.IntegerField()
        birth = models.DateField(auto_now=True)
    
    
    class Publisher(models.Model):
        name = models.CharField(max_length=32)
    
    class Book(models.Model):
        title = models.CharField(max_length=32)
        publisher = models.ForeignKey(to='Publisher')
    
    class Author(models.Model):
        name = models.CharField(max_length=32)
        books = models.ManyToManyField(to='Book')
    
    

    接下来我们来写py文件

    必知必会13条:

      

       #all 查询所有数据   Queryset
        ret = models.Person.objects.all()
        # print(ret)

    #get 获取一个对象,如果查询没有或者多个 就报错 ret1 = models.Person.objects.get(id = 1) ret2 = models.Person.objects.get(name='阿瑟东') # print(ret1) # print(ret2)

    #filter 查询所有满足条件的对象 ——》QuerySet ret = models.Person.objects.filter(id=1) ret = models.Person.objects.filter(name='阿瑟东')
    # exclude 查询所有不满足条件的对象 ——》QuerySet ret = models.Person.objects.exclude(id=1) # print(ret)

    # values 不写参数 取对象的所有字段数据 指定参数 取对象指定字段的参数 ——》QuerySet 元素是字典 ret = models.Person.objects.values() ret = models.Person.objects.values('id','name','age') # print(ret) # for i in ret: # print(i)

    # values_list # 不写参数 取对象的所有字段数据 元组形式 # 指定参数 取对象指定字段的参数 ——》QuerySet 按照你参数顺序排序 ret = models.Person.objects.values_list() ret = models.Person.objects.values_list('name','id') # print(ret) # for i in ret : # print(i)

    # order_by 按照指定字段排序 默认升序 加负号降序 # 可以多字段排序 ret = models.Person.objects.all().order_by('age','-id') # print(ret) # for i in ret: # print(i,i.id,i.age)

    # reverse 对已经排序的QuerySet进行反向排序 # 用了order_by 要不用了ordering ret = models.Person.objects.all().order_by().reverse() # print(ret) ret = models.Person.objects.all().reverse()#没有效果 # print(ret)

    # distinct 去重 ret = models.Person.objects.values('name','age').distinct() # print(ret)

    # count() 计数 对QuerySet的对象进行计数 ret = models.Person.objects.filter(name='和尚').count() # print(ret)
    #first 返回第一条记录 ret = models.Person.objects.first() # print(ret)

    #last 返回最后一条记录 ret = models.Person.objects.last() # print(ret)

    # exists() 如果QuerySet包含数据,就返回True,否则返回False ret = models.Person.objects.filter(id=5).exists() print(ret)

    小结一下:

        返回QuerySet列表的方法:
          1. all()
          2. filter()
          3. exclude()
          4. values()
          5. values_list()
          6. reverse()
          7. distinct()
          8. order_by()

        返回具体对象的方法:
          1. get()
          2. first()
          3. last()

        返回数字的方法:
          1. count()

        返回布尔值:
          1. exists()

    单表查询之神奇的双下划线:

      

        # 获取大于1小于3的值
        ret = models.Person.objects.filter(id__gt=1,id__lt=3)
        #大于1
        ret1 = models.Person.objects.filter(id__gt=1)
        #小于3
        ret2 = models.Person.objects.filter(id__lt=3)
        # print(ret1)
        # print(ret2)
        # 获取id等于1,3,5,7,9的值,如果没有,就不获取。
        ret = models.Person.objects.filter(id__in=[1,3,5,7,9])
        # print(ret)
        #获取id不等于1,3,5的值
        ret = models.Person.objects.exclude(id__in=[1,3,5])
        # print(ret)
        #获取名字中包含‘阿’的值
        ret = models.Person.objects.filter(name__contains='')
        # print(ret)
        #icontains对英文的大小写不敏感。 获取名字中包含as的值
        ret = models.Person.objects.filter(name__icontains='as')
        # print(ret)
        #获取id范围值为1到3的值
        ret = models.Person.objects.filter(id__range=[1,3])
        # print(ret)
        #startswith endswith istartwith iendswith
        ret1 = models.Person.objects.filter(name__startswith='')
        ret2 = models.Person.objects.filter(name__istartswith='')
        ret3= models.Person.objects.filter(name__endswith='')
        ret4 = models.Person.objects.filter(name__iendswith='')
        # print(ret1)
        # print(ret2)
        # print(ret3)
        # print(ret4)
        ret = models.Person.objects.filter(birth__day=1)
        ret = models.Person.objects.filter(birth__day=1)
        ret = models.Person.objects.filter(birth__contains='2018-08')
        print(ret)

    ForeignKey操作:(一对多)

    正向查找:

      我们都知道,外键是建在多的对象中的,从多到一的查找是正向查询,反之就是反向查询。

         #正向查询
        #基于对象查询
        book_obj = models.Book.objects.filter(id=5).first()
        # print(book_obj.title)
        # print(book_obj.publisher)
        # print(book_obj.publisher.id)
        # print(book_obj.publisher.name)
        #基于字段的查询
        ret = models.Book.objects.filter(publisher__name='沙河出版社')
        ret = models.Book.objects.filter(publisher__id=1)
        # print(ret)
        # for i in ret:
            # print(i.publisher.name)

    反向查找:

    #反向查询
        # 没有在外键中指定related_name,使用pub_obj.book_set.all() 拿所有出版社关联的书籍对象
        ret = models.Publisher.objects.get(id=1)
        # print(ret.book_set.all())
        # print(ret.book_set.first())
        # print(ret.book_set.values('title'))
    
        # 在外键中指定related_name = 'bookkk',使用pub_obj.books.all() 拿所有出版社关联的书籍对象
        # print(ret.bookkk.all())
        #基于字段的查询
        ret = models.Publisher.objects.filter(bookkk__title='西游记')
        # print(ret)

    ManyToManyField:

       author_obj = models.Author.objects.first()
        # print(author_obj.books.all())
        author_obj.books.create(title='按时的德国',publisher_id = 1)
        # 1. 先创建书籍对象
        # 2. 创建author_obj和新建书籍对象的对应关系
        shahe = models.Publisher.objects.first()
        # print(shahe.book_set.all())
        # print(shahe.books.all())
        shahe.book_set.create(title='跟进老板学十大')
    
        author_obj.books.add(16)# 给作者添加id为16的书
    
        author_obj.books.set([])#清空作者和所有书籍的关系
        books_obj = models.Book.objects.filter(publisher_id=1)
        author_obj.books.add(*books_obj)#给作者添加publisher_id=1的书
    
        author_obj.books.remove(*books_obj) #移除作者的publisher_id=1的书
        # set可以添加可以删除,是更新的意思,set里放的是列表【】
        #remove,add()添加或删除的都是一个一个的对象用*打散。
        author_obj.books.set(books_obj)
    
        author_obj.books.clear()

    注意:

    对于ForeignKey对象,clear()和remove()方法仅在外键null=True时存在。

    pub_obj = models.Publisher.objects.first()
    pub_obj.book_set.clear()

    聚合查询和分组查询:

    聚合:

    aggregate()QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。

    键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的。

    用到的内置函数:

    from django.db.models import Avg, Sum, Max, Min, Count

    示例:

    ret = models.Book.objects.aggregate(Avg('price'))
        print(ret)
    结果是:
    {'price__avg': 80.42913}

    如果你想要为聚合值指定一个名称,可以向聚合子句提供它。

    ret = models.Book.objects.aggregate(pingjun = Avg('price'))
        print(ret)
    结果为:
    {'pingjun': 80.42913}

    也可以有多个聚合值:

      ret = models.Book.objects.aggregate(pingjun = Avg('price'),zonghe=Sum('price'),shuliang=Count('id'))
        ret = models.Book.objects.aggregate(Avg('price'),Sum('price'),Count('id'))
        print(ret)

     分组:

    #统计每一本书的作者个数
        ret = models.Book.objects.annotate(Count('author')).values()
        # print(ret)
        # for i in ret:
        #     print(i)
        #统计出每个出版社买的最便宜的书的价格
        ret = models.Publisher.objects.annotate(Min('books__price')).values()
        # for i in ret:
        #     print(i)
        #统计不止一个作者的图书
        ret = models.Book.objects.annotate(Count('author')).values().filter(author__count__gt=1)
        # for i in ret:
        #      print(i)
        #根据一本图书作者数量的多少对查询集 QuerySet进行排序
        ret = models.Book.objects.annotate(Count('author')).values().order_by('author__count__gt')
        # print(ret)
        #查询各个作者出的书的总价格
        ret = models.Author.objects.annotate(Sum('books__price')).values()
        print(ret)

    F查询和Q查询:当两个字段进行比较的时候就会用到F查询和Q查询

    F查询:

    
    
    from django.db.models import F, Q
    #比较book中库存小于sale的书籍
    # ret = models.Book.objects.filter(kucun__lt=F('sale'))
    # for i in ret:
    #     print(i.title,i.kucun,i.sale)
    #将id为1的书名改为。
    # book_obj=models.Book.objects.get(id=1)
    # book_obj.title='西游记啊啊啊'
    # book_obj.save()
    #另一种更改书名的方法  利用queryset
    # models.Book.objects.filter(id=1).update(title='西游记')
    #给书的kucun加上点书  加减乘除运算
    # models.Book.objects.all().update(kucun=F('kucun')+100)
    
    
    #把所有书名后面加上(第一版),先引入
    #
    from django.db.models.functions import Concat
    from django.db.models import Value
    models.Book.objects.all().update(title=Concat(F('title'),Value('(第一版)')))
    
    

    Q查询:

    #查寻id小于3大于5的书籍  |  &  ~
        ret = models.Book.objects.filter(Q(id__lt=3)|Q(id__gt=5)).values()
        ret = models.Book.objects.filter(Q(id__lt=3)& Q(id__gt=5)).values()
        #查询id不为3且小于5的书籍
        ret = models.Book.objects.filter(~Q(id=3),id__lt=5)
        # for i in ret:
        #     print(i)

    事务:

    只要一件事不成功,整件事就失败。要成功都成功,一件事失败整件事就回滚。以转账为例,我给你打钱成功了,但是你没收到,这整件事就是不成功的。

    import os
    
    if __name__ == "__main__":
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "untitled4.settings")
        import django
        django.setup()
    
        from app01 import models
    
        try:
            from django.db import transaction
    
            with transaction.atomic():
                #创建山河银行,
                models.Publisher.objects.create(name='山和银行')
                #然后查询id为100的publisher
                models.Publisher.objects.get(id=100)
                #这必然是不成功的,因为publisher中不存在id为100的publisher所以,之前的创建也没有创建成功
    
        except Exception as e:
            print(str(e))
     

      

  • 相关阅读:
    《数据结构和Java集合框架》第二章学习笔记
    《数据结构和Java集合框架》第一章学习笔记
    Arbotix关节控制器的实现(十)
    Arbotix关节控制器的实现(九)
    MoveIt编程实现机械臂自主避障运动(六)
    ROS机械臂开发_MoveIt!与机械臂控制(七)
    IOI2020国家集训队作业选做Part1
    模拟费用流问题略解
    PKUSC2021部分题目简要题解
    ARC 119部分题目简要题解
  • 原文地址:https://www.cnblogs.com/yb635238477/p/9411578.html
Copyright © 2011-2022 走看看