• Django之ORM相关操作


    一般操作

    常用的13个操作

    <1> all():                 查询所有结果
     
    <2> filter(**kwargs):      它包含了与所给筛选条件相匹配的对象
     
    <3> get(**kwargs):         返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。
     
    <4> exclude(**kwargs):     它包含了与所给筛选条件不匹配的对象
     
    <5> values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列
     
    <6> values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
     
    <7> order_by(*field):      对查询结果排序
     
    <8> reverse():             对查询结果反向排序,请注意reverse()通常只能在具有已定义顺序的QuerySet上调用(在model类的Meta中指定ordering或调用order_by()方法)。
     
    <9> distinct():            从返回结果中剔除重复纪录(如果你查询跨越多个表,可能在计算QuerySet时得到重复的结果。此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重。)
     
    <10> count():              返回数据库中匹配查询(QuerySet)的对象数量。
     
    <11> first():              返回第一条记录
     
    <12> last():               返回最后一条记录
     
    <13> exists():             如果QuerySet包含数据,就返回True,否则返回False

    返回QuerySet对象的方法有

    all()
    
    filter()
    
    exclude()
    
    order_by()
    
    reverse()
    
    distinct()

    特殊的QuerySet

    values()         返回一个可迭代的字典序列
    
    values_list()    返回一个可迭代的元祖序列

    返回具体的对象

    get()
    first()
    last()

    返回布尔值

    exists()

    返回数字

    count()

     单表查询常用操作

    gt - Greater than

    大于

     例: 

    models.Person.objects.filter(id__gt=4)    # 获取id大于4的值

    对应的SQL语句:

    SELECT ... WHERE id > 4;

    gte - Greater than or equal to

    大于或等于

    lt - Less than

    小于

    lte - Less than or equal to

    小于或等于

    例: 获得id大于2且小于5的值

    models.Person.objects.filter(id__gt=2, id__lt=5)

     in

    给定的是可迭代的, 通常是列表, 元组或者queryset.

    例:

    models.Person.objects.filter(id__in=[1, 3])    # 获取id等于1, 3的数据

    对应的SQL语句:

    SELECT ... WHERE id IN (1, 3);

    contains

    区分大小写

    例:

    models.Person.objects.filter(name__contains='a')    # 获取name字段中包含"a"的数据

    对应的SQL语句:

    SELECT ... WHERE name LIKE '%a%';

    icontains

    不区分大小写

    例:

    models.Person.objects.filter(name__contains='a')    # 获取name字段中包含"a"或者"A"的数据

    对应的SQL语句:

    SELECT ... WHERE name ILIKE '%a%';

    range

    包括两边的边界值

    例:

    models.Person.objects.filter(id__range=[1, 3])    # id范围是1到3

    对应的SQL语句:

    SELECT ... WHERE id BETWEEN 1 and 3;

    startswith

    以...开头, 区分大小写

    例:

    models.Person.objects.filter(name__startswith='a')

    对应的SQL语句:

    SELECT ... WHERE name LIKE 'a%';

    类似的:

    istartswith

    以...开头, 不区分大小写

    endswith

    以...结尾, 区分大小写

    iendswith

    以...结尾, 不区分大小写


    year

    例:

    models.Person.objects.filter(birth__year=2019)

    对应的SQL语句:

    SELECT ... WHERE birth BETWEEN '2019-01-01' AND '2019-12-31';

     ForeignKey操作

    正向查找

    对象查找(跨表)

    语法: 

    对象.关联字段.字段

    例:

    book_obj = models.Book.objects.first()  # 第一本书对象
    print(book_obj.press)  # 得到这本书关联的出版社对象
    print(book_obj.press.name)  # 得到出版社对象的名称

    字段查找(跨表)

    语法:

    关联字段__字段

    例:

    print(models.Book.objects.values('press__name'))
    obj = models.Book.objects.filter(press__name='xx出版社')
    print(obj)

    反向查找

    对象查找

    语法:

    默认:
    obj.表名_set
    
    表名_set可以自己命名

    例:

    press_obj = models.Press.objects.first()    # 找到第一个出版社对象
    books = press_obj.books.all()    # 找到第一个出版社出版的所有书
    titles = books.values_list('title')    # 找到第一个出版社出版的所有书的书名
    print(books)
    print(titles)

    字段查找

    语法:

    表名__字段

    例:

    titles = models.Press.objects.values_list('books__title')
    # books__title中的books是自己在models.py中, related_name='books'
    # 具体的代码:
    class Book(models.Model):
        title = models.CharField(max_length=32)
        press = models.ForeignKey(to='Press', on_delete=models.CASCADE, related_name='books')

    ManyToManyField

    class RelatedManager

    "关联管理器"是在一对多或者多对多的关联上下文中使用的管理器。

    它存在于下面两种情况:

    1. 外键关系的反向查询
    2. 多对多关联关系

    简单来说就是当 点 后面的对象 可能存在多个的时候就可以使用以下的方法。

    方法

    create()

    创建一个新的对象,保存对象,并将它添加到关联对象集之中,返回新创建的对象。

    obj = models.Author.objects.first()
    obj.books.create(title='一起来学MATLAB', press_id=2)

    add()

    把指定的model对象添加到关联对象集中。

    添加对象

    obj = models.Author.objects.first()
    obj.books.add(*models.Book.objects.all())

    添加id

    obj = models.Author.objects.first()
    obj.books.add(*[3, 4])

    set()

    更新model对象的关联对象

    obj = models.Author.objects.first()
    obj.books.set([1, 2])

    remove()

    从关联对象集中移除执行的model对象

    obj = models.Author.objects.first()
    obj.books.remove(1)

    clear()

    从关联对象集中移除一切对象

    obj = models.Author.objects.first()
    obj.books.clear()

    注意:

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

    详情见 Django官方文档

  • 相关阅读:
    mysql索引类型 normal, unique, full text
    16.信号量互斥编程
    15.信号通信编程
    14.有名管道通信
    13.无名管道通讯编程
    12.多进程程序的操作
    11.进程控制理论
    10.时间编程
    9. 库函数方式文件编程
    8.Linux文件编程
  • 原文地址:https://www.cnblogs.com/lpgit/p/10946264.html
Copyright © 2020-2023  润新知