django-orm专项练习

准备表

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)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值