django-orm专项练习
2018-01-24 21:59
633 查看
准备表
普通查询练习
简单示例
单表查询
一对多查询
一对一查询
多对多查询
双下划线
查询id为1的出版社的出版的所有书籍(反向查找)
查询所有addr=”**”的作者姓名
查询某个人写的书
查询小仙女出版的所有书籍名称
查询沙河出版社出版的书籍的书名和作者姓名
本例中的关联关系如下,如果改成ManyToManyField放在Book中
修改后的测试(伪代码)
普通查询练习
简单示例
单表查询
一对多查询
一对一查询
多对多查询
双下划线
准备表
from django.db import models # Create your models here. class Publisher(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=32) addr = models.CharField(max_length=32) phone = models.IntegerField def __str__(self): return self.name # 作者查书,设计到作者里面 class Author(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=16) author_detail = models.OneToOneField("AuthorDetail") # 多对多 books = models.ManyToManyField(to="Book") def __str__(self): return self.name class Book(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(max_length=6) price = models.DecimalField(max_digits=5, decimal_places=2) publish_day = models.DateField(auto_now_add=True) # 书-出版社 多对一关联 publisher = models.ForeignKey(to="Publisher", to_field="id") def __str__(self): return self.title class AuthorDetail(models.Model): id = models.AutoField(primary_key=True) city = models.CharField(max_length=32) email = models.EmailField() def __str__(self): return self.city
普通查询练习
from app05 import models import datetime #查找所有书名里包含**的书 models.Book.objects.filter(title__contains="一") <QuerySet [<Book: 书一>]> #查找出版日期是2017年的书 models.Book.objects.filter(publish_day__year=2017) <QuerySet [<Book: 书一>]> #查找出版日期是2018年的书名 models.Book.objects.filter(publish_day__year=2018).values("title") <QuerySet [{'title': '书二'}, {'title': '书三'}]> #查找价格大于10元的书 models.Book.objects.filter(price__gt=10) <QuerySet [<Book: 书一>, <Book: 书二>, <Book: 书三>]> #查找价格大于10元的书名和价格 models.Book.objects.filter(price__gt=10).values("title","price") <QuerySet [{'title': '书一', 'price': Decimal('111.12')}, {'title': '书二', 'price': Decimal('233.33')}, {'title': '书三', 'price': Decimal('233.33')}]> 查找字段title是空的书 models.Book.objects.filter(title__isnull=True) <QuerySet []>
#查找名字以沙河开头的出版社 models.Publisher.objects.filter(name__startswith="国") <QuerySet [<Publisher: 国贸>]> #查找书名是**的书的出版社 models.Book.objects.get(title="书一").publisher <Publisher: 沙河出版社> #查找书名是**的书的出版社的名称 models.Book.objects.get(title="书一").publisher.name '沙河出版社' #查找书名是**的书的所有作者 models.Book.objects.get(title="书一").author_set.all() <QuerySet [<Author: 小一>, <Author: 小三>]> #查找书名是**的书的作者的名字 models.Book.objects.get(title="书一").author_set.all().values("name") <QuerySet [{'name': '小一'}, {'name': '小三'}]>
简单示例
单表查询
查询书名为**的书models.Book.objects.filter(title="书三") <QuerySet [<Book: 书三>]>
一对多查询
查询id为1的书的出版社所在的城市models.Book.objects.get(id=1).publisher.addr '沙河地铁站'
查询id为1的出版社的出版的所有书籍(反向查找)
models.Book.objects.get(id=1).publisher.book_set.all() <QuerySet [<Book: 书一>]>
一对一查询
查询**作者的邮箱models.Author.objects.get(name="小一").author_detail.email '1@1'
查询所有addr=”**”的作者姓名
tmp = models.AuthorDetail.objects.filter(city="北京").all() for i in tmp: print(i.author.name) 小一 小四
多对多查询
查询**所有作者的姓名和邮箱(正向查找)models.Book.objects.get(title="书一").author_set.all() <QuerySet [<Author: 小一>, <Author: 小三>]> tmp = models.Book.objects.get(title="书一").author_set.all() for i in tmp: print(i.name) 小一 小三
查询某个人写的书
models.Author.objects.get(name="小一").books.all() <QuerySet [<Book: 书一>, <Book: 书二>]>
双下划线
查询沙河出版社出版的所有书籍的名称和价格#正向查询 models.Book.objects.filter(publisher__name="沙河出版社").values("title","price") <QuerySet [{'title': '书一', 'price': Decimal('111.12')}, {'title': '书二', 'price': Decimal('233.33')}]> #反向查询 models.Publisher.objects.get(name="沙河出版社").book_set.all().values("title","price") <QuerySet [{'title': '书一', 'price': Decimal('111.12')}, {'title': '书二', 'price': Decimal('233.33')}]> models.Publisher.objects.get(name="沙河出版社").book_set.all().values_list("title","price") <QuerySet [('书一', Decimal('111.12')), ('书二', Decimal('233.33'))]> #双下划线反查 models.Publisher.objects.filter(name="沙河出版社").values_list("book__title","book__price") <QuerySet [('书一', Decimal('111.12')), ('书二', Decimal('233.33'))]>
查询小仙女出版的所有书籍名称
models.Author.objects.get(name="小一").books.all().values("title") <QuerySet [{'title': '书一'}, {'title': '书二'}]> models.Book.objects.filter(author__name="小一").values_list("title") <QuerySet [('书一',), ('书二',)]>
查询沙河出版社出版的书籍的书名和作者姓名
models.Publisher.objects.get(name="沙河出版社").book_set.all().values("title") <QuerySet [{'title': '书一'}, {'title': '书二'}]> models.Book.objects.filter(publisher__name="沙河出版社").all().values("title") <QuerySet [{'title': '书一'}, {'title': '书二'}]> models.Publisher.objects.filter(name="沙河出版社").values("book__title") <QuerySet [{'book__title': '书一'}, {'book__title': '书二'}]>
本例中的关联关系如下,如果改成ManyToManyField放在Book中
# 作者查书,设计到作者里面 class Author(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=16) author_detail = models.OneToOneField("AuthorDetail") # 多对多 books = models.ManyToManyField(to="Book") def __str__(self): return self.name class Book(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(max_length=6) price = models.DecimalField(max_digits=5, decimal_places=2) publish_day = models.DateField(auto_now_add=True) # 书-出版社 多对一关联 publisher = models.ForeignKey(to="Publisher", to_field="id") def __str__(self): return self.title
修改后的测试(伪代码)
查询沙河出版社出版的所有书籍的名称和价格 (正向查) models.Book.objects.filter(publisher__name="沙河出版社").values_list("title", "price") <QuerySet [('番茄物语', Decimal('9.90')), ('香蕉物语', Decimal('9.90'))]> 反向查 models.Publisher.objects.get(name="沙河出版社").book_set.all().values_list("title", "price") <QuerySet [('番茄物语', Decimal('9.90')), ('香蕉物语', Decimal('9.90'))]> 双下划线反查 models.Publisher.objects.filter(name="沙河出版社").values_list("book__title", "book__price") <QuerySet [('番茄物语', Decimal('9.90')), ('香蕉物语', Decimal('9.90'))]> 查询小仙女出版的所有书籍名称 正向查 models.Book.objects.filter(author__name="小仙女").values_list("title") <QuerySet [('番茄物语',), ('橘子物语',)]> 反向查 models.Author.objects.get(name="小仙女").book_set.all().values_list("title") <QuerySet [('番茄物语',), ('橘子物语',)]> 双下划线反查 models.Author.objects.filter(name="小仙女").values_list("book__title") <QuerySet [('番茄物语',), ('橘子物语',)]> 查询沙河出版社出版的书籍的书名和作者姓名 正向查 models.Book.objects.filter(publisher__name="沙河出版社").values_list("title", "author__name") <QuerySet [('番茄物语', '小精灵'), ('番茄物语', '小仙女'), ('香蕉物语', '小魔女')]> 反向查 models.Publisher.objects.filter(name="沙河出版社").values_list("book__title", "book__author__name") <QuerySet [('番茄物语', '小精灵'), ('番茄物语', '小仙女'), ('香蕉物语', '小魔女')]> 双下划线反向查 models.Publisher.objects.get(name="沙河出版社").book_set.all().values_list("title", "author__name") <QuerySet [('番茄物语', '小精灵'), ('番茄物语', '小仙女'), ('香蕉物语', '小魔女')]> 补充 查询memo为空的所有书 models.Book.objects.filter(memo__isnull=True)
相关文章推荐
- django orm操作2的练习源码内容
- 【django之orm小练习】
- django orm操作练习
- Django进阶Model篇004 - ORM常用操作
- Django基于ORM操作数据库的方法详解
- Django-ORM多对多查询 (自定义第三张表&ManyToManyField)
- Django入门4: ORM 数据库操作
- Django(ORM使用)
- Django模型系统——ORM校园管理系统代码
- django ORM model filter 条件过滤,及多表连接查询、反向查询字段
- DJANGO的ORM的Q查询作多字段外键的模糊查询样码
- django-orm字段、自定义字段、字段参数、元信息、多表关系
- 将SALT_STACK的JOB-CACHE放到数据库中,而建库用DJANGO的ORM完成
- django ORM model filter 条件过滤,及多表连接查询、反向查询,某字段的distinct
- Django 模型系统(model)&ORM--进阶
- django-orm进阶操作
- 牛客网——java专项练习029
- python django -2 ORM模型
- 牛客网——java专项练习020
- CMDB之Django 数据库ORM操作