# 作业
class Author(models.Model):
'''
作者
'''
name = models.CharField(max_length=100)
age = models.IntegerField()
class BookType(models.Model):
'''
图书
'''
caption = models.CharField(max_length=64)
class Book(models.Model):
name = models.CharField(max_length=64)
pages = models.IntegerField()
price = models.DecimalField(max_digits=10,decimal_places=2)
pubdate = models.DateField(auto_now=True)
authors = models.ManyToManyField("Author")
book_type = models.ForeignKey("BookType")
#####作业
#1 添加数据
# BookType.objects.create(caption="文学")
# BookType.objects.create(caption="地理")
# BookType.objects.create(caption="天文")
# Author.objects.create(name="alex",age=18)
# Author.objects.create(name="eric",age=19)
# Author.objects.create(name="liujianzuo",age=20)
# 2 等1 创建完在创建这个
# Book.objects.create(name="金品梅",pages=11111,price=1,book_type_id=1)
# Book.objects.create(name="某某传",pages=11112,price=3,book_type_id=1)
# Book.objects.create(name="某传",pages=11113,price=2,book_type_id=1)
# print("ok")
# 3 添加多对多关系表 通过alex反射三本书 外键字段在book类 因此反向插入
# auth = Author.objects.get(name="alex")
# auth.book_set.add(*Book.objects.filter(id__gt=1)) # filter 获取的是个集合 内部是迭代的对象
# auth.book_set.add(*Book.objects.filter(id=1)) #如果这里用get而不是filter就不用加*
# 3 正向插入
# from django.db.models import Q
# buk = Book.objects.get(id =1)
# buk.authors.add(*Author.objects.filter(~Q(name ="alex"))) # filter过滤不等于
# 4 通过根据书名获取到对象,外键在这个book类,因此需要正向查找
# 4.1 正向第一种
# ret = Book.objects.filter(book_type__caption="文学").values("name","price","pubdate","book_type")
# print(ret)
# for k in ret:
# print("==bookname--%s==="%(k['name']))
# for n,v in k.items():
# print(n,v)
# 4.2 正向第二种查找
# ret = Book.objects.all()
# for item in ret:
# if item.book_type.caption == "文学":
# print(item.name,item.price,item.pubdate,item.book_type.caption)
#4.3 反向查找 第一种 book_set
# obj = BookType.objects.get(caption="文学")
# ret = obj.book_set.all()
# for item in ret:
# print(item.name,item.price,item.pubdate,item.book_type.caption)# 非filter跨表用点 item.book_type.caption
# 4.4 反向查找 第二种
# ret = BookType.objects.all().values("book__name","book__price","book__pubdate","caption")
# for item in ret:
# if item["caption"] == "文学":
# for k,v in item.items():
# print(k,v)
# else:
# continue
# 5 查找作者alex 参与的所有书籍,等。。 多对多 外键在book类 ,从book类查找是正向
# 5.1 第一种查找
# ret = Book.objects.filter(authors__name="alex").values("name","price","pubdate","authors__name","book_type__caption")
# for k in ret:
# for n,v in k.items():
# print(n,v)
# 5.2 第二种
# ret= Book.objects.all()
# for item in ret:
# # print(item.authors.all().values("book__authors__name"))
# x = item.authors.all().values("book__authors__name")
# for n in x:
# for k,v in n.items():
# if v == "alex" :
# print(v, item.name, item.price, item.pubdate, item.book_type.caption)
# 5.3 第三种
# ret = Author.objects.get(name="alex") # get获取
# obj = ret.book_set.all()
# print(obj)
# for i in obj:
# print(ret.name,i.name,i.price,i.pubdate,i.book_type.caption)
# 5.4 第四种
# ret = Author.objects.all().values("name","book__name","book__price","book__pubdate","book__book_type__caption")
# # print(ret)
# for item in ret:
# if item["name"] == "alex":
# for k,v in item.items():
# print(k,v)
# else:
# continue