Django之ORM(二)

必知必会13条


准备数据

from django.db import models

# Create your models here.

class MyCharField(models.Field):
    """
    自定义的char类型的字段类
    """

    def __init__(self, max_length, *args, **kwargs):
        self.max_length = max_length
        super(MyCharField, self).__init__(max_length=max_length, *args, **kwargs)

    def db_type(self, connection):
        """
        限定生成数据库表的字段类型为char,长度为max_length指定的值
        """
        return 'char(%s)' % self.max_length

class Person(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32, db_column='myname', verbose_name='姓名')
    age = models.IntegerField(null=True, blank=True)
    birth = models.DateTimeField(auto_now=True)
    phone = MyCharField(max_length=11)
    sex = models.IntegerField(choices=((1, '男'), (2, '女')))

    class Meta:
        # 数据库中生成的表名称 默认 app名称 + 下划线 + 类名
        db_table = "person"

        # 在admin中的显示, 一般直接加verbose_name_plural
        verbose_name = '个人信息'   # 显示 个人信息s
        verbose_name_plural = '所有用户信息'  #  显示所有用户信息

        # 联合索引
        index_together = [('name', 'age')]

        # 联合唯一索引
        # unique_together = (("name", "age"))

        # 排序
        # ordering = ('age', )

    def __str__(self):
        return 'Person <{}:{}>'.format(self.id, self.name)

<1> all():

--->> 查询所有结果 --->> 对象列表

ret = models.Person.objects.all()
print(ret)

输出结果

<QuerySet [<Person: Person <1:魏新雨咋软>>, <Person: Person <2:陈骏啊, 萨宁啊>>]>

SQL语句

(0.000) SELECT @@SQL_AUTO_IS_NULL; args=None
(0.001) SELECT `person`.`id`, `person`.`myname`, `person`.`age`, `person`.`birth`, `person`.`phone`, `person`.`sex` FROM `person` LIMIT 21; args=()

**<2> filter(**kwargs): **

--->> 查询出所有满足条件的对象 ---->> 对象列表

ret = models.Person.objects.filter(sex=1)
print(ret)

输出结果

<QuerySet [<Person: Person <1:魏新雨咋软>>, <Person: Person <2:陈骏啊, 萨宁啊>>]>

SQL语句

(0.000) SELECT @@SQL_AUTO_IS_NULL; args=None
(0.001) SELECT `person`.`id`, `person`.`myname`, `person`.`age`, `person`.`birth`, `person`.`phone`, `person`.`sex` FROM `person` LIMIT 21; args=()

**<3> get(**kwargs): **

返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误

ret = models.Person.objects.get(id=1)
print(ret)

输出结果

Person <1:魏新雨咋软>

SQL语句

(0.000) SELECT @@SQL_AUTO_IS_NULL; args=None
(0.000) SELECT VERSION(); args=None
(0.001) SELECT `person`.`id`, `person`.`myname`, `person`.`age`, `person`.`birth`, `person`.`phone`, `person`.`sex` FROM `person` WHERE `person`.`id` = 1; args=(1,)

**<4> exclude(**kwargs): **

--->> 查询出所有不满足条件的对象 ------>> 对象列表

ret = models.Person.objects.exclude(id=1)
print(ret)

输出结果

<QuerySet [<Person: Person <2:陈骏啊, 萨宁啊>>]>

SQL语句

(0.000) SELECT @@SQL_AUTO_IS_NULL; args=None
(0.000) SELECT VERSION(); args=None
(0.000) SELECT `person`.`id`, `person`.`myname`, `person`.`age`, `person`.`birth`, `person`.`phone`, `person`.`sex` FROM `person` WHERE NOT (`person`.`id` = 1) LIMIT 21; args=(1,)

<5> values(*field):

---->> 取具体的数据 ------> 对象列表 ---->>> 元素 {字段: 值}

 ret = models.Person.objects.all().values('id', 'name')
    for i in ret:
        print(i, type(i))

输出结果

{'id': 2, 'name': '陈骏啊, 萨宁啊'} <class 'dict'>
{'id': 1, 'name': '魏新雨咋软'} <class 'dict'>

SQL语句

(0.000) SELECT @@SQL_AUTO_IS_NULL; args=None
(0.000) SELECT `person`.`id`, `person`.`myname` FROM `person`; args=()

<6> values_list(*field):

---->> 取具体的数据 ------> 对象列表 ---->>> 元素 (字段, 值)

ret = models.Person.objects.all().values_list('id', 'name')
    for i in ret:
        print(i, type(i))

输出结果

(2, '陈骏啊, 萨宁啊') <class 'tuple'>
(1, '魏新雨咋软') <class 'tuple'>

SQL语句

(0.000) SELECT @@SQL_AUTO_IS_NULL; args=None
(0.000) SELECT `person`.`id`, `person`.`myname` FROM `person`; args=()

<7> order_by(*field):

可以指定多个字段 (默认升序, 在字段前加 - 降序)

ret = models.Person.objects.all().order_by('-age')
print(ret)

输出结果

<QuerySet [<Person: Person <1:魏新雨咋软>>, <Person: Person <2:陈骏啊, 萨宁啊>>]>

SQL语句

(0.000) SELECT @@SQL_AUTO_IS_NULL; args=None
(0.001) SELECT `person`.`id`, `person`.`myname`, `person`.`age`, `person`.`birth`, `person`.`phone`, `person`.`sex` FROM `person` ORDER BY `person`.`age` DESC LIMIT 21; args=()

<8> reverse():

对查询结果反向排序,请注意reverse()通常只能在具有已定义顺序的QuerySet上调用(在model类的Meta中指定ordering或调用order_by()方法)

ret = models.Person.objects.all().order_by('age').reverse()
print(ret)

输出结果

<QuerySet [<Person: Person <1:魏新雨咋软>>, <Person: Person <2:陈骏啊, 萨宁啊>>]>

SQL语句

(0.000) SELECT @@SQL_AUTO_IS_NULL; args=None
(0.001) SELECT `person`.`id`, `person`.`myname`, `person`.`age`, `person`.`birth`, `person`.`phone`, `person`.`sex` FROM `person` ORDER BY `person`.`age` DESC LIMIT 21; args=()

<9> distinct():

从返回结果中剔除重复纪录(如果你查询跨越多个表,可能在计算QuerySet时得到重复的结果。此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重)

<10> count():

返回数据库中匹配查询(QuerySet)的对象数量

ret = models.Person.objects.all().count()
print(ret)

输出结果

2

SQL语句

(0.000) SELECT @@SQL_AUTO_IS_NULL; args=None
(0.000) SELECT COUNT(*) AS `__count` FROM `person`; args=()

<11> first(): 返回第一条记录

ret = models.Person.objects.first()
print(ret)

输出结果

Person <1:魏新雨咋软>

SQL语句

(0.000) SELECT @@SQL_AUTO_IS_NULL; args=None
(0.001) SELECT `person`.`id`, `person`.`myname`, `person`.`age`, `person`.`birth`, `person`.`phone`, `person`.`sex` FROM `person` ORDER BY `person`.`id` ASC LIMIT 1; args=()

<12> last(): 返回最后一条记录

ret = models.Person.objects.last()
print(ret)

输出结果

Person <2:陈骏啊, 萨宁啊>

SQL语句

(0.000) SELECT @@SQL_AUTO_IS_NULL; args=None
(0.001) SELECT `person`.`id`, `person`.`myname`, `person`.`age`, `person`.`birth`, `person`.`phone`, `person`.`sex` FROM `person` ORDER BY `person`.`id` DESC LIMIT 1; args=()

<13> exists():

如果QuerySet包含数据,就返回True,否则返回False

ret = models.Person.objects.filter(id=100).exists()
print(ret)

输出结果

False

SQL语句

(0.000) SELECT @@SQL_AUTO_IS_NULL; args=None
(0.000) SELECT VERSION(); args=None
(0.000) SELECT (1) AS `a` FROM `person` WHERE `person`.`id` = 100 LIMIT 1; args=(100,)

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


ret = models.Person.objects.filter(id__gt=1)  # greater than  大于
ret = models.Person.objects.filter(id__lt=4)  # less than  小于
ret = models.Person.objects.filter(id__gte=1)  # greater than equal  大于等于
ret = models.Person.objects.filter(id__lte=4)  # greater than equal  小于等于
ret = models.Person.objects.filter(id__in=[1,3])  # 获取id是1 和 id是3的数据
ret = models.Person.objects.filter(id__range=[1,3])  # 获取id是1 和 id是3的数据
ret = models.Person.objects.filter(id__in=[1,3])  # 获取id是1 和 id是3的数据
ret = models.Person.objects.filter(id__gte=1, id__lt=3)  # 获取id大于1小于3的数据
ret = models.Person.objects.filter(id__range=[1,3]) # 获取id在1到3之间的数据
ret = models.Person.objects.filter(name__contains='新') # 获取name字段中包含新的数据
ret = models.Person.objects.filter(name__icontains='sb') # 获取name字段中包含sb的数据, 忽略大小写
ret = models.Person.objects.filter(name__startswith='l') # 获取name字段中以小写l开头的数据
ret = models.Person.objects.filter(name__istartswith='l') # 获取name字段中以l开头的数据, 忽略大小写

ForeignKey操作


准备表格


from django.db import models

# 出版社表
class Press(models.Model):
    id = models.AutoField(primary_key=True)  # id主键
    name = models.CharField(max_length=32)  # 出版社名称

    def __str__(self):
        return '<这是一个出版社对象,它的名字是:{}>'.format(self.name)

# 书
class Book(models.Model):
    id = models.AutoField(primary_key=True)  # 自增id主键
    title = models.CharField(max_length=30)  # 书名
    price = models.IntegerField(null=True)
    # Django 1.11 默认就是级联删除, Django 2.0之后必须指定on_delete
    # to=关联的表名
    press = models.ForeignKey(to='Press', on_delete=models.CASCADE)

# 作者
class Author(models.Model):
    id = models.AutoField(primary_key=True)  # 自增id主键
    name = models.CharField(max_length=32)  # 作者名字
    books = models.ManyToManyField(to='Book')  # 只是ORM层面建立的一个多对多关系,不是作者表的一个字段

    def __str__(self):
        return self.name

正向查找


对象查找(跨表)



语法:

对象.关联字段.字段

示例:

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

字段查找(跨表)

语法:**关联字段__字段**

示例:

print(models.Book.objects.values_list('press__book__title'))

反向操作


对象查找

语法:

obj.表名_set

示例:

press_obj = models.Press.objects.get(id=1)   # 找到第一个出版社对象
books = press_obj.book_set.all()   # 找到第一个出版社出版的所有书
title = books.values_list("title")  # 找到第一个出版社出版的所有书的书名

字段查找

语法:

**表名__字段**

示例:

title = models.Press.objects.values_list('book__title').filter(id=1)

ManyToManyField


class RelatedManager

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

它存在于下面两种情况:

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

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

方法

create()

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

models.Author.objects.first().books.create(title='偷塔秘籍', press_id=1)

SQL语句

(0.000) SELECT `app01_author`.`id`, `app01_author`.`name` FROM `app01_author` ORDER BY `app01_author`.`id` ASC LIMIT 1; args=()
(0.000) INSERT INTO `app01_book` (`title`, `price`, `press_id`) VALUES ('偷塔秘籍', NULL, 1); args=['偷塔秘籍', None, 1]
(0.001) SELECT `app01_author_books`.`book_id` FROM `app01_author_books` WHERE (`app01_author_books`.`author_id` = 1 AND `app01_author_books`.`book_id` IN (6)); args=(1, 6)
(0.000) INSERT INTO `app01_author_books` (`author_id`, `book_id`) VALUES (1, 6); args=(1, 6)

add()

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

添加对象

添加id

set()

更新某个对象在第三张表中的关联对象。不同于上面的add是添加,set相当于重置

set可以理解为SQL语句中的in, 所以参数传的是列表

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

SQL语句

(0.000) SELECT `app01_author`.`id`, `app01_author`.`name` FROM `app01_author` ORDER BY `app01_author`.`id` ASC LIMIT 1; args=()
(0.001) SELECT `app01_book`.`id` FROM `app01_book` INNER JOIN `app01_author_books` ON (`app01_book`.`id` = `app01_author_books`.`book_id`) WHERE `app01_author_books`.`author_id` = 1; args=(1,)
(0.001) DELETE FROM `app01_author_books` WHERE (`app01_author_books`.`author_id` = 1 AND `app01_author_books`.`book_id` IN (6)); args=(1, 6)
(0.001) SELECT `app01_author_books`.`book_id` FROM `app01_author_books` WHERE (`app01_author_books`.`author_id` = 1 AND `app01_author_books`.`book_id` IN (1, 2)); args=(1, 1, 2)
(0.005) INSERT INTO `app01_author_books` (`author_id`, `book_id`) VALUES (1, 1), (1, 2); args=(1, 1, 1, 2)

原文地址:https://www.cnblogs.com/cjwnb/p/11797689.html

时间: 2024-08-11 03:26:02

Django之ORM(二)的相关文章

Django:之ORM、CMS和二维码生成

Django ORM Django 的数据库接口非常好用,我们甚至不需要知道SQL语句如何书写,就可以轻松地查询,创建一些内容,所以有时候想,在其它的地方使用Django的 ORM呢?它有这么丰富的 QuerySet API. settings.py import os BASE_DIR = os.path.dirname(os.path.dirname(__file__)) SECRET_KEY = 'at8j8i9%[email protected]#64^0&qlr6m5yc(_&m

人生苦短,我用python-- Day19 django框架之URL路由系统、视图应用、模板应用、django之orm应用

目录 一.django的URL应用 二.django的视图应用 三.django的模板应用 四.django的orm应用 补充: 补充一:getlis 应用场景:当前端发送的数据为多个的时候,后台如果还用get获取数据,那么就会出问题,所以这里有一个getlist方法进行数据的获取. 试验案例:当前端有一个多选的checkbox的时候,那么就要使用getlist进行获取数据了 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^get

Django之ORM性能优化建议

前言 DjangoORM数据层提供各种途径优化数据的访问. 如果事先理解Django的优化技巧,开发过程中稍稍留意,后期会省不少的工作量. 正题 一,利用标准数据库优化技术 传统数据库优化技术博大精深,不同的数据库有不同的优化技巧,但重心还是有规则的.在这里算是题外话,挑两点通用的说说: 索引,给关键的字段添加索引,性能能更上一层楼,如给表的关联字段,搜索频率高的字段加上索引等.Django建立实体的时候,支持给字段添加索引,具体参考Django.db.models.Field.db_index

九、Django之ORM

一.前言 用于实现面向对象编程语言里不同类型系统的数据之间的转换,换言之,就是用面向对象的方式去操作数据库的创建表以及增删改查等操作. 到目前为止,当我们的程序涉及到数据库相关操作时,一般操作流程如下: 创建数据库,设计表结构和字段: 使用 MySQLdb 来连接数据库,并编写数据访问层代码,使用原生SQL语句进行访问数据: 业务逻辑层去调用数据访问层执行数据库操作,获取结果: ORM是什么?Object Relational Mapping(关系对象映射) 1.类名------>数据库中的表名

Django中ORM字段以及字段参数介绍

一:Django中ORM的介绍 1.ORM的概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中. ORM在业务逻辑层和数据库层之间充当了桥梁的作用. 2.ORM的来源 让我们从O/R开始.字母O起源于"对象"(Object),而R则来自于"关系"(Relational)

Django学习【第5篇】:Django之ORM数据库操作

django之ORM数据库操作 一.ORM介绍 映射关系: 表名 -------------------->类名 字段-------------------->属性 表记录----------------->类实例化对象 ORM的两大功能: 操作表: - 创建表 - 修改表 - 删除表 操作数据行: - 增删改查 ORM利用pymysql第三方工具链接数据库 Django没办法帮我们创建数据库,只能我们创建完之后告诉它,让django去链接 二.创建表之前的准备工作 一.自己创建数据库

Django的orm中get和filter的不同

Django的orm框架对于业务复杂度不是很高的应用来说还是不错的,写起来很方面,用起来也简单.对于新手来说查询操作中最长用的两个方法get和filter有时候一不注意就会犯下一些小错误.那么今天就来小节下这两个方法使用上的不同. 首先对比下两个函数文档上的解释. get Returns the object matching the given lookup parameters, which should be in the format described in Field lookups

【Django】ORM操作#2 &#343866;

目录 必知必会的13条查询方法 单表查询之神奇的双下划线 一对多 ForeignKey 多对多 ManyToManyField 在Python脚本中调用Django环境 Django终端打印SQL语句 关于Mate类 聚合查询 aggregage() 分组查询 annotate() F查询 Q查询 事务 其它鲜为人知的操作 原文: http://blog.gqylpy.com/gqy/264 @ *** 必知必会的13条查询方法 ==1. all()== 查询所有结果 . ==2. get(kw

DJango周总结二:模型层,单表,多表操作,连表操作,数据库操作,事务

django周复习二 1,模型层:  1单表操作:   13个必会操作总结    返回QuerySet对象的方法有    all()    filter()    exclude()    order_by()    reverse()    distinct()    特殊的QuerySet    values()       返回一个可迭代的字典序列    values_list() 返回一个可迭代的元祖序列    返回具体对象的    get()    first()    last()