zoukankan      html  css  js  c++  java
  • django orm操作

    返回的是Queryset的方法:
    all()    全部
    filter()  返回的是列表,没有是none
    values()   Queryset  元素是字典   不写参数默认全部字段   写参数拿到字段指定的参数
    values_list() Queryset 元素是元组 不写参数默认全部字段值 写参数拿到指定的参数
    order_by() 按字段顺序查询
    distinct() 去重  去重是对结果中同一个对象进行去重,不是所有字段的值都相等就是同一个对象。
    reverse()对已经排序的QuerySet进行排序,1,是order_by 2,在创建表的时候加上
    class Meta:
        ordering = ('id',)
    exclude()获取不满足条件的全部对象(反转)
     
    返回的是对象
    get()  获取单个对象,空和多个值会报错
    first()  获取QuerySet的第一个值
    last() 获取QuerySet的最后一个值
     
    返回的是布尔值
    exists() 查询是否有有值
     
    返回的是数字
    count()   返回的是数字
     
     
    双下划线:刚刚好尴尬,明明是双下滑线,和抽风一样就写一个,光报错
     
    ret = models.Person.objects.filter(id__lt=3)  # less than   小于,和linux 其中的几个相似
        ret = models.Person.objects.filter(id__gt=3)  # great than 大于
     
        ret = models.Person.objects.filter(id__gte=3)  # great than equel  小于等于
        ret = models.Person.objects.filter(id__lte=3)  # great than equel  大于等于
        ret = models.Person.objects.filter(id__gte=3, id__lte=5)
     
        ret = models.Person.objects.exclude(id__gt=5)
     
        ret = models.Person.objects.filter(id__in=[1, 3, 5])   包含
        ret = models.Person.objects.exclude(id__in=[1, 3, 5])
     
        ret = models.Person.objects.filter(id__gte=1, id__lte=100)  < 值<
        ret = models.Person.objects.filter(id__range=[1, 5])  之间的值,
        ret = models.Person.objects.filter(name__contains='A')  包含有
        ret = models.Person.objects.filter(name__icontains='a') 不区分大小写
     
        ret = models.Person.objects.filter(name__istartswith='a')  以什么开头
        ret = models.Person.objects.filter(name__endswith='x') 以什么结尾
     
        ret = models.Person.objects.filter(birth__year='2018')  查询是2018年的
        ret = models.Person.objects.filter(birth__month='09')
        ret = models.Person.objects.filter(name__isnull=True)
     
    外键查询:
    正向查询:
    基于对象查询
    正向查询   book ——》 publisher
        # book_obj = models.Book.objects.get(id=1)
        # print(book_obj.id)
        # print(book_obj.title)
        # print(book_obj.publisher_id)
        # print(book_obj.publisher_id)  # 关联的出版社对象
        # 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)
     
     
    反向查询: publisher ——》 book
    基于对象的查询:
    pub_obj = models.Publisher.objects.first()  获取对象
    1
    书名小写_set:
    print(pub_obj)
        # ret = pub_obj.book_set.all()
        # print(pub_obj.book_set,type(pub_obj.book_set))
        # print(ret)
    2
      related_name  books
        # print(pub_obj.books.all()) 指定了名字
    基于字段的查找
    ret = models.Publisher.objects.filter(xx__title='跟太亮学开车')
    print(ret)
     
     
    多对多
    create() 创建新的对象,并将它添加到关联的对象集中,返回创建的对象集
    add() 把指定的model对象添加到关联的对象集中,如果是QuerySet的话,*obj,数字id或者对象,单独add,或者对象 关联关系
    set()用的多,可以清空,可以更新添加元素的时候[]   或者对象列表
    remove() 一个对象,多个的话需要*obj  关联关系,                                                                                            在一对多中,多要求models:null=Ture,不能使用id,要使用obj
    clear()从关联集中中移出一切
     
        # author_obj.books.create(title='戴绿与嫂子的故事',publisher_id=1)
        # 1. 创建书籍对象(与出版社进行关联)
        # 2. 该对象和作者进行关联
     
    pub_obj= models.Publisher.objects.first()
        # pub_obj.book_set
        # pub_obj.books.create(title='跟老男孩学思想') 在外键上设置
    related_name
    set
        # author_obj.books.set([1,6,8,9])
        # author_obj.books.set(books)
     
        # author_obj.books.remove(*books)
     
        # author_obj.books.clear()
       pub_obj = models.Publisher.objects.get(id=1)
     
        # 一对多的管理对象remove不能使用id  使用对象
        # pub_obj.books.remove(models.Book.objects.get(id=5))
     
        pub_obj.books.clear()
    聚合:aggregate()
    from django.db.models import Avg, Sum, Max, Min, Count
    aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。
    如果想要给聚合指定一个名称,可以向聚合子句提供它
    models.Book.objects.aggregate(average_price=Avg('price'))
    {'average_price': 13.233333}
     
    可以生成不止一个聚合,models.Book.objects.all().aggregate(Avg("price"), Max("price"), Min("price"))  注意使用时先是默认值,后是关键字
     
    分组:annotate
    F查询:自己表中的多个数据
    1,可以在自己表中进行比较
    models.Book.objects.filter(commnet_num__lt=F('keep_num')*2
    2,修改操作,
    models.Book.objects.all().update(price=F("price")+30)
    Q,查询:|相当于或  &相当于和   注意~Q取反
    1,models.Book.objects.filter(Q(authors__name="小仙女")|Q(authors__name="小魔女"))
    查询出版年份是2017或2018,书名中带物语的所有书。
    >> models.Book.objects.filter(Q(publish_date__year=2018) | Q(publish_date__year=2017), title__icontains="物语")
    <QuerySet [<Book: 番茄物语>, <Book: 香蕉物语>, <Book: 橘子物语>]>
    事物:
    满足则成功执行 ,不满足,则不执行
    from django.db import transaction
    try:
        with transaction.atomic():
            models.Book.objects.create(title='xxx1', price='111', publisher_id=1)
            models.Book.objects.create(title='xxx', price='111', publisher_id=100)
    except Exception as e:
        print(str(e))
     
     
    一对一的:
    OneToOneField(to='关联的表')(一对一)
    在ForeignKey基础上加一个束缚 unique=true
    所有的内容可以写在一个表中
    有的字段不常查,但有的字段查的很频繁
    单表的增删改查中:
    update()              只更新那个字段
    和获取到对象在进行添加区别   更新所有的字段
     

  • 相关阅读:
    javascript学习笔记(一):基础、输出、注释、引用、变量、数据类型
    black-hole《XSS的原理分析与解剖》阅读笔记
    《xss跨站脚本剖析与防御》实验笔记
    XSS和CSRF的区别
    前端常用插件、工具类库汇总(下)
    前端常用插件、工具类库汇总(上)
    前端特效【第03期】|果汁混合效果-上
    玩转 React 【第03期】:邂逅 React 组件
    前端修炼の道 | 如何成为一名合格前端开发工程师?
    前端特效【第02期】|多功能提交按钮
  • 原文地址:https://www.cnblogs.com/lnrick/p/9692943.html
Copyright © 2011-2022 走看看