ORM那些相关操作,ORM表相关操作

作者: 网络编程  发布:2019-08-08

诚如操作

看专门的职业的官方网址文档,做标准的技师!

相似操作

看专门的学业的官方网址文书档案,做标准的程序员!

必知必会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 

必知必会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对象的措施有

all()

filter()

exclude()

order_by()

reverse()

distinct()

特殊的QuerySet

values()       再次来到三个可迭代的字典类别

values_list() 再次回到一个可迭代的元祖连串

特殊的QuerySet

values()       重临多个可迭代的字典种类

values_list() 重返叁个可迭代的元祖连串

归来具体对象的

get()

first()

last()

回来具体对象的

get()

first()

last()

回到布尔值的法子有:

exists()

归来布尔值的办法有:

exists()

回去数字的主意有

count()

重返数字的章程有

count()

单表查询之美妙的双下划线

# 大于,小于
#
# models.Tb1.objects.filter(id__gt=1)                # 获取id大于1的值
# models.Tb1.objects.filter(id__gte=1)                # 获取id大于等于1的值
# models.Tb1.objects.filter(id__lt=10)                 # 获取id小于10的值
# models.Tb1.objects.filter(id__lte=10)                # 获取id小于10的值
# models.Tb1.objects.filter(id__lt=10, id__gt=1)       # 获取id大于1 且 小于10的值

# in
#
# models.Tb1.objects.filter(id__in=[11, 22, 33])           # 获取id等于11、22、33的数据
# models.Tb1.objects.exclude(id__in=[11, 22, 33])          # not in

# contains
# models.Tb1.objects.filter(name__contains="ven")          # 获取name字段包含"ven"的
# models.Tb1.objects.filter(name__icontains="ven")         # icontains大小写不敏感

# range
# models.Tb1.objects.filter(id__range=[1, 3])              # id范围是1到3的,等价于SQL的bettwen and

类似的还有:startswith,istartswith, endswith, iendswith 

# date字段还可以:
# models.Class.objects.filter(first_day__year=2017)

单表查询之奇妙的双下划线

models.Tb1.objects.filter(id__lt=10, id__gt=1)   # 获取id大于1 且 小于10的值

models.Tb1.objects.filter(id__in=[11, 22, 33])   # 获取id等于11、22、33的数据
models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not in

models.Tb1.objects.filter(name__contains="ven")  # 获取name字段包含"ven"的
models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感

models.Tb1.objects.filter(id__range=[1, 3])      # id范围是1到3的,等价于SQL的bettwen and

类似的还有:startswith,istartswith, endswith, iendswith 

date字段还可以:
models.Class.objects.filter(first_day__year=2017)

单表查询演练

1、创制数据库

create database orm;

2、models文件

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    birthday = models.DateField()

3、数据表增多内容如下

图片 1

4、项目目录下面包车型客车orm演练文件

图片 2图片 3

import os
if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day8_15ORM.settings")
    import django
    django.setup()

    from app01 import models

    # all   查询所有人
    ret = models.Person.objects.all()
    print(ret)
    #// <QuerySet [<Person: <Person-Object:  张三>>, <Person: <Person-Object:  李四>>, <Person: <Person-Object:  王五>>, <Person: <Person-Object:  小黑>>, <Person: <Person-Object:  小白>>, <Person: <Person-Object:  小黄>>]>

    # get   指定查询
    ret = models.Person.objects.get(id=2)
    print(ret)
    #// <Person-Object:  李四>

    # filter
    # 就算查询的结果只有一个,返回的也是QuerySet,我们要用索引的方式取出第一个元素
    ret = models.Person.objects.filter(id=2)
    print(ret)
    #// <QuerySet [<Person: <Person-Object:  李四>>]>

    # 如果要取指定的元素,需要通过索引
    ret = models.Person.objects.filter(id=2)[0]
    print(ret)
    #// <Person-Object:  李四>

    # 不存在返回一个空的QuerySet,不会报错
    ret = models.Person.objects.filter(id=20)
    print(ret)
    #//    <QuerySet []>

    # exclude   # 查询除了id值为1的所有人
    ret = models.Person.objects.exclude(id=1)
    print(ret)
    #//    <QuerySet [<Person: <Person-Object:  李四>>, <Person: <Person-Object:  王五>>, <Person: <Person-Object:  小黑>>, <Person: <Person-Object:  小白>>, <Person: <Person-Object:  小黄>>]>

    # values    # 根据指定字段查询, 返回的是一个QuerySet对象,里面都是字典。
    ret = models.Person.objects.values("name")
    print(ret)
    #//    <QuerySet [{'name': '张三'}, {'name': '李四'}, {'name': '王五'}, {'name': '小黑'}, {'name': '小白'}, {'name': '小黄'}]>
    # 如果不写value, 默认查询所有
    ret = models.Person.objects.values()
    print(ret)
    #//    <QuerySet [{'id': 1, 'name': '张三', 'age': 10, 'birthday': datetime.date(2008, 8, 5)}, {'id': 2, 'name': '李四', 'age': 20, 'birthday': datetime.date(1998, 6, 2)}, {'id': 3, 'name': '王五', 'age': 30, 'birthday': datetime.date(1988, 3, 2)}, {'id': 4, 'name': '小黑', 'age': 40, 'birthday': datetime.date(1978, 11, 14)}, {'id': 5, 'name': '小白', 'age': 12, 'birthday': datetime.date(2006, 2, 7)}, {'id': 6, 'name': '小黄', 'age': 50, 'birthday': datetime.date(1968, 5, 20)}]>

    # values_list   # 通values一样,只是返回的里面是元组
    ret = models.Person.objects.values_list("name")
    print(ret)
    #//    <QuerySet [('张三',), ('李四',), ('王五',), ('小黑',), ('小白',), ('小黄',)]>
    # 如果不写value, 默认查询所有
    ret = models.Person.objects.values_list()
    print(ret)
    #//    <QuerySet [(1, '张三', 10, datetime.date(2008, 8, 5)), (2, '李四', 20, datetime.date(1998, 6, 2)), (3, '王五', 30, datetime.date(1988, 3, 2)), (4, '小黑', 40, datetime.date(1978, 11, 14)), (5, '小白', 12, datetime.date(2006, 2, 7)), (6, '小黄', 50, datetime.date(1968, 5, 20))]>

    # order_by  对查询结果按照指定字段排序, 根据年龄排序
    ret = models.Person.objects.all().order_by("age")
    print(ret)
    #//    <QuerySet [<Person: <Person-Object:  张三>>, <Person: <Person-Object:  小白>>, <Person: <Person-Object:  李四>>, <Person: <Person-Object:  王五>>, <Person: <Person-Object:  小黑>>, <Person: <Person-Object:  小黄>>]>

    # reverse   根据年龄排序,再进行反转
    ret = models.Person.objects.all().order_by("age").reverse()
    print(ret)
    #//    <QuerySet [<Person: <Person-Object:  小黄>>, <Person: <Person-Object:  小黑>>, <Person: <Person-Object:  王五>>, <Person: <Person-Object:  李四>>, <Person: <Person-Object:  小白>>, <Person: <Person-Object:  张三>>]>

    # count 统计匹配查询的对象数量
    ret = models.Person.objects.all().count()
    print(ret)
    #//    6

    # first 查询第一条记录
    ret = models.Person.objects.first()
    print(ret)
    #//    <Person-Object:  张三>

    # last  查询最后一条记录
    ret = models.Person.objects.last()
    print(ret)
    #//    <Person-Object:  小黄>

    # exists    判断表中是否有数据
    ret = models.Person.objects.exists()
    print(ret)
    #//    True


    单表查询之神奇的双下划綫
    # 查询id值大于1小于4的结果
    ret = models.Person.objects.filter(id__gt=1, id__lt=4)
    print(ret)
    #//    <QuerySet [<Person: <Person-Object:  李四>>, <Person: <Person-Object:  王五>>]>

    # in    查询id值在 [1, 3, 5, 7]中的结果
    ret = models.Person.objects.filter(id__in=[1, 3, 5, 7])
    print(ret)
    #//    <QuerySet [<Person: <Person-Object:  张三>>, <Person: <Person-Object:  王五>>, <Person: <Person-Object:  小白>>]>

    # not in
    ret = models.Person.objects.exclude(id__in=[1, 3, 5, 7])
    print(ret)
    #//    <QuerySet [<Person: <Person-Object:  李四>>, <Person: <Person-Object:  小黑>>, <Person: <Person-Object:  小黄>>]>

    # contains  查询name字段包含三的
    ret = models.Person.objects.filter(name__contains="三")
    print(ret)
    #//    <QuerySet [<Person: <Person-Object:  张三>>]>

    # range 查询id范围在1到3之间的
    ret = models.Person.objects.filter(id__range=[1,3])
    print(ret)
    #//    <QuerySet [<Person: <Person-Object:  张三>>, <Person: <Person-Object:  李四>>, <Person: <Person-Object:  王五>>]>

    # 日期和时间字段还可以有以下写法
    ret = models.Person.objects.filter(birthday__year=2008)
    print(ret)
    #//    <QuerySet [<Person: <Person-Object:  张三>>]>
    # 根据月查询
    ret = models.Person.objects.filter(birthday__month=6)
    print(ret)
    #//    <QuerySet [<Person: <Person-Object:  李四>>]>

orm.py

ForeignKey操作

ForeignKey操作

正向查找

正向查找

对象查找(跨表)

语法:

对象**.关联字段.**字段

 

示例:

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

目的查找(跨表)

语法:

对象**.涉嫌字段.**字段

示例:

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

字段查找(跨表)

语法:

论及字段**__**字段

 

示例:

print(models.Book.objects.values_list("publisher__name"))

字段查找(跨表)

语法:

关系字段**__**字段

示例:

print(models.Book.objects.values_list("publisher__name"))

反向操作

反向操作

对象查找

语法:

obj.表名_set

示例:

publisher_obj = models.Publisher.objects.first()  # 找到第一个出版社对象
books = publisher_obj.book_set.all()  # 找到第一个出版社出版的所有书
titles = books.values_list("title")  # 找到第一个出版社出版的所有书的书名

对象查找

语法:

obj.表名_set

示例:

publisher_obj = models.Publisher.objects.first()  # 找到第一个出版社对象
books = publisher_obj.book_set.all()  # 找到第一个出版社出版的所有书
titles = books.values_list("title")  # 找到第一个出版社出版的所有书的书名

字段查找

语法:

表名__字段

示例:

titles = models.Publisher.objects.values_list("book__title")

字段查找

语法:

表名__字段

示例:

titles = models.Publisher.objects.values_list("book__title")

ManyToManyField

一对一涉及查询演练

图片 4图片 5

from django.db import models

class Publisher(models.Model):
    name = models.CharField(max_length=64, unique=True)

class Book(models.Model):
    title = models.CharField(max_length=64)     # 书名
    price = models.DecimalField(max_digits=5, decimal_places=2, default=19.99)     # 价格
    # 外键
    # related_name="books" 反向查询是用来代替 book_set的
    publisher = models.ForeignKey(to="Publisher", on_delete=models.CASCADE, related_name="books", null=True)

models.py

向表里增添数据

出版社表及书籍表的相应关系

图片 6

图片 7图片 8

import os
if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day8_15ORM.settings")
    import django
    django.setup()

    from app01 import models

    # 说明:#//    行内容是打印的输出结果
    # 外键的查询操作
    # 正向查询
    # 基于对象 跨表查询
    book_obj = models.Book.objects.first()  # 查询的书对象
    print(book_obj.publisher)   # 和我这本书关联的出版社对象 
    #//    Publisher object
    print(book_obj.publisher.name)  # 得到出版社对象的名字
    #//    西丽出版社

    # 基于字段 跨表查询
    # 查询id是1的书的出版社的名称
    print(models.Book.objects.filter(id=1).values_list("publisher__name"))  # 得到出版社对象的名字
    #// 西丽出版社


    # 反向查询
    # 基于对象 跨表查询
    # 方法一:如果modles中的表结构的ForeignKey类型中保函了related_name属性可以使用下面的方法进行查询。 related_name="books",
    publisher_obj = models.Publisher.objects.get(id=1)  #查询的出版社对象
    books = publisher_obj.books.all()   # 得到出版社对应的所有书籍    
    print(books[0].title)      # 取出第一本书的名字
    #// Python中国

    # 方法二:没有指定related_name
    publisher_obj = models.Publisher.objects.get(id=1)   #查询的出版社对象
    books = publisher_obj.book_set.all()    # 得到出版社对应的所有书籍
    print(books[0].title)   # 取出第一本书的名字

    # 基于字段  跨表查询
    books = models.Publisher.objects.filter(id=1).values_list("book__title")    # 查询id为1的出版社的书籍
    print(books)

orm.py

class RelatedManager

"关联管理器"是在一对多依然多对多的涉及上下文中使用的管理器。

它存在于下边二种情景:

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

轻松的话正是当 点后边的对象 可能存在多少个的时候就能够使用以下的艺术。

本文由金沙澳门官网发布于网络编程,转载请注明出处:ORM那些相关操作,ORM表相关操作

关键词: 金沙澳门官网

上一篇:python基础语法
下一篇:没有了