django知识之ORM查询

1. ORM字段

1. AutoField(primary_key=True)      -------->自增且主键
2. CharField(max_length=16)         --------->varchar类型(char类型可以自定义 类改写db_type)
3. IntegerField(null=True) --> 最大10位    -------->int类型(最大10位所以手机号码一般用char或者varchar类型)
4. DateField(auto_now_add=True)/DatetimeField(auto_now=True)   ------->相当于(date:年月日,datetime:年月日 小时分钟秒)

    配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库;

    配置上auto_now=True,每次更新数据记录的时候会更新该字段
5. EmailField()
6. TextField()     
7. BooleanField()    ------结果是布尔值
8. DecimalField --DecimalField(max_digits =5,decimal_places =2[,**选项]) ----进度是5,其中小数位是2

2. 字段参数

1. null=True --> 可以为空
2. default=100 --> 默认值
3. unique=True --> 唯一
4. db_index=True --> 建立索引

3. 关系字段

1. ForeignKey() --> 外键关联
2. OneToOneField() --> 一对一关联
3. ManyToManyField() --> 多对多

字段参数:
1. to=‘类名‘
2. to_field=‘属性名‘

4. 必知必会13条

1. 返回QuerySet:

1. all()
2. filter()
3. exclude()
4. order_by()
5. reverse()
6. distinct()

7. values() --> 字典的列表
8. values_list() --> 元组的列表

2. 返回具体对象:

1. get()
2. first()
3. last()

3. 返回数字:

1. count()

4. 返回布尔值

1. exists()

5.django中运行测试脚本

在app项目下的test.py里面写入一下代码即可

import os

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

    # ORM查询操作
    from app01 import models      #用app01为例

    。。。。。测试内容。。。。

5.ORM连表查询

  1 import os
  2
  3 if __name__ == ‘__main__‘:
  4     os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_demo.settings")
  5     import django
  6     django.setup()
  7
  8     # ORM查询操作
  9     from app01 import models
 10
 11     # 1. 查找所有书名里包含番茄的书
 12     # ret = models.Book.objects.filter(title__contains=‘番茄‘)
 13     # print(ret)
 14     # 2. 查找出版日期是2017年的书
 15     # ret = models.Book.objects.filter(publish_date__year=2017)
 16     # print(ret)
 17     # 3. 查找出版日期是2017年的书名
 18     # ret = models.Book.objects.filter(publish_date__year=2017).values("title")
 19     # print(ret)
 20
 21     # 查找价格大于10元的书
 22     # ret = models.Book.objects.filter(price__gt=10)
 23     # print(ret)
 24
 25     # 查找价格大于10元的书名和价格
 26     # ret = models.Book.objects.filter(price__gt=10).values("title", "price")
 27     # print(ret)
 28     # 查找memo字段是空的书
 29     # ret = models.Book.objects.filter(memo__isnull=True)
 30     # print(ret)
 31
 32     # 查找在北京的出版社
 33     # ret = models.Publisher.objects.filter(city=‘北京‘)
 34     # print(ret)
 35
 36     # 查找名字以沙河开头的出版社
 37     # ret = models.Publisher.objects.filter(name__startswith="沙河")
 38     # print(ret)
 39
 40     # 查找作者名字里面带‘小‘字的作者
 41     # ret = models.Author.objects.filter(name__contains=‘小‘)
 42     # print(ret)
 43
 44     # 查找年龄大于30岁的作者
 45     # ret = models.Author.objects.filter(age__gt=30)
 46     # print(ret)
 47
 48     # 查找手机号是155开头的作者
 49     # ret = models.Author.objects.filter(phone__startswith=‘155‘)
 50     # print(ret)
 51
 52     # 查找手机号是155开头的作者的姓名和年龄
 53     # ret = models.Author.objects.filter(phone__startswith=‘155‘).values("name", "age")
 54     # print(ret)
 55
 56     # 连表查询
 57     # book_obj = models.Book.objects.first()
 58     # 基于对象查找
 59     # ret = book_obj.publisher.name
 60     # print(ret)
 61     # 基于双下划线的跨表查询
 62     # ret = models.Book.objects.values("publisher__name", "publisher__city").first()
 63     # print(ret)
 64
 65     # 正向查找
 66     # 查找书名是“番茄物语”的书的出版社
 67     # 1. 基于对象的查找方式
 68     # ret = models.Book.objects.get(title="番茄物语").publisher
 69     # print(ret)
 70     # 查找书名是“番茄物语”的书的出版社所在的城市
 71     # ret = models.Book.objects.get(title="番茄物语").publisher.city
 72     # print(ret)
 73     # 2. 基于双下划线的夸表查询
 74     # ret = models.Book.objects.filter(title="番茄物语").values("publisher__city")
 75     # print(ret)
 76
 77     # 外键的反向查找
 78     # 1. 基于对象的查找方式
 79     # publisher_obj = models.Publisher.objects.first()
 80     # ret = publisher_obj.book_set.all()
 81     # print(ret)
 82     # 如果设置了 related_name="books"
 83     # publisher_obj = models.Publisher.objects.first()
 84     # ret = publisher_obj.books.all()
 85     # print(ret)
 86
 87     # 基于双下划线的跨表查询
 88     # ret = models.Publisher.objects.filter(id=1).values("books__title")
 89     # print(ret)
 90
 91     # 如果设置了 related_query_name="zhangzhao"
 92     # ret = models.Publisher.objects.filter(id=1).values("zhangzhao__title")
 93     # print(ret)
 94
 95
 96     # 多对多操作
 97     # 1. create
 98     # 做了两件事情:
 99     # 1. 创建了一个新的作者,2. 将新创建的作者和第一本书做关联
100     # ret = models.Book.objects.first().author.create(
101     #     name="张曌",
102     #     age=16,
103     #     phone="18012575998",
104     #     detail_id=4
105     # )
106     # ret = models.Book.objects.first().author.all().values("id")
107     # print(ret)
108
109
110     # 2. set
111     # models.Book.objects.first().author.set([2,3])
112     # ret = models.Book.objects.first().author.all().values("id")
113     # print(ret)
114
115     # 3. add
116     # models.Book.objects.first().author.add(1)
117
118     # ret = models.Book.objects.first().author.all().values("id")
119     # print(ret)
120
121     # 4. remove
122     # models.Book.objects.first().author.remove(3)
123
124     # ret = models.Book.objects.first().author.all().values("id")
125     # print(ret)
126
127     # 5.clear
128     # models.Book.objects.first().author.clear()
129     #
130     # ret = models.Book.objects.first().author.all().values("id")
131     # print(ret)
132
133     # 6. all
134     # ret = models.Book.objects.first().author.all()
135     # print(ret)
136
137     # 聚合
138     # 查询所有书的总价格
139     from django.db.models import Avg, Sum, Max, Min, Count
140     #
141     # ret = models.Book.objects.aggregate(total_price=Sum("price"))
142     # print(ret)
143     #
144     # ret = models.Book.objects.aggregate(avg_price=Avg("price"), max_price=Max("price"), min_price=Min("price"))
145     # print(ret)
146
147
148     # 求每一本书的作者个数
149     # ret = models.Book.objects.annotate(c=Count("author")).values("title", "c")
150     # print(ret)
151
152
153     # 统计出每个出版社买的最便宜的书的价格
154     # ret = models.Publisher.objects.annotate(min_price=Min("books__price")).values("name", "min_price")
155     # print(ret)
156
157     # 统计不止一个作者的图书 (书作者的数量大于1)
158     # ret = models.Book.objects.annotate(c=Count("author")).filter(c__gt=1)
159     # print(ret)
160
161     # 按照书作者的数量做排序
162     # ret = models.Book.objects.annotate(c=Count("author")).order_by("c")
163     # print(ret)
164
165     # 查询各个作者出的书的总价格
166
167     # ret = models.Author.objects.annotate(sum_price=Sum("book__price")).values("name", "sum_price")
168     # print(ret)

orm连表查询实例测试

原文地址:https://www.cnblogs.com/dingyutao/p/9210559.html

时间: 2024-10-08 05:15:55

django知识之ORM查询的相关文章

ORM查询相关补充

自己没有记住的一点小知识(ORM查询相关) 一.多对多的正反向查询 class Class(models.Model): name = models.CharField(max_length=32,verbose_name="班级名") course = models.CharField(verbose_name="课程",max_length=32) def __str__(self): return self.name class Teacher(models.

web.py中实现类似Django中的ORM的查询效果

Django中的对象查询 Django框架自带了ORM,实现了一些比较强大而且方便的查询功能,这些功能和表无关.比如下面这个例子: class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') >>> Question.objects.all() >>> Question.ob

Django—— ORM查询(sql优化)优化了解,Django(元信息)元类建索引

Django(元信息)元类建索引 索引:索引的一个主要目的就是加快检索表中数据,索引是经过某种算法优化过的,因而查找次数要少的多.可见,索引是用来定位的. class Book(models.Model) name = models.CharField(max_length=64) class Meta: # 自定义表名 db_table = 'table_name' # 联合索引: 索引的一个主要目的就是加快检索表中数据 index_together = ('tag1', 'tag2') #

django模型层 、 ORM查询

模型层 ORM查询 单表查询 前期准备工作需求: 如何只单独测试django中的某一个py文件 如何书写测试脚本 如何使用: 在任意一个py文件中书写以下代码 应用下的tests 或者自己新建一个 import os if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day53.settings") import django django.se

django orm查询方法详解

目录 1.1.1 生成查询 1.1.2 创建对象 1.1.3 保存修改的对象 1.1.4 保存 ForeignKey 和 ManyToManyField 字段 1.1.5 检索对象 1.1.6 检索所有的对象 1.1.7 过滤检索特定对象 1.1.8 链接过滤 1.1.9 过滤结果集是唯一 1.2.1 结果集是延迟的 1.2.2 其他的QuerySet方法 1.2.3 限制 QuerySets 1.2.4 字段查找 1.2.5 跨关系查询 1.2.6 过滤器可参考模型字段 1.2.7 缓存查询集

Django 第十课 4.【ORM查询操作】

#查询 1:exact:在底层会被翻译成 '=' article = Article.objects.filter(title__exact='hello') 2:iexact:在底层被翻译成 'LIKE' article = Article.objects.filter(title__iexact='hello') * LIKE 和 = :大部分情况下都是等价的,只有少数情况下是不等价的. * exact和iexact:他们的区别其实就是LIKE和=的区别,因为exact会被翻译成=,而iex

Python 学习第十九天 django知识

一,django 知识总结 1,同一个name属性的标签,多个值获取 <form action="/login/" method="POST" enctype="multipart/form-data"> <p> <input type="text" name="user" placeholder="用户名" /> </p> <p&g

django之数据库orm

django之数据库orm 一.数据库的配置 1 django默认支持sqlite,mysql, oracle,postgresql数据库. <1>sqlite django默认使用sqlite的数据库,默认自带sqlite的数据库驱动 引擎名称:django.db.backends.sqlite3 <2>mysql 引擎名称:django.db.backends.mysql 2 mysql驱动程序 MySQLdb(mysql python) mysqlclient MySQL P

Python 学习第二十三天 django 知识(五)

一,django 的model操作 1,字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列,必须填入参数 primary_key=True 注:当model中如果没有自增列,则自动会创建一个列名为id的列 from django.db import models class UserInfo(models.Model): # 自动创建一个列名为id的且为自增的整数列 us