您的位置:首页 > 编程语言 > Go语言

django-orm专项练习

2018-01-24 21:59 633 查看
准备表

普通查询练习

简单示例
单表查询

一对多查询

一对一查询

多对多查询

双下划线

准备表

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: