day52 多表操作 一对多29 +25 min+53min+44min

first last  get 取到的是一个实例对象,并非一个Query集合对象

publishs=models.ForeignKey('Publish',on_delete=models.CASCADE)
在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错:
TypeError: __init__() missing 1 required positional argument: 'on_delete'

举例owner=models.ForeignKey(UserProfile,on_delete=models.CASCADE)

#查询记录(通过对象)
一对多
正向查询:
book_obj=Book.objects.get(name="python")
pub_obj=book_obj.publish----》书籍对象对应的出版社对象,一对多情况下一定是一个对象
pub_obj.name
反向查询:
pub_obj = Publish.objects.filter(name="人民出版社")[0]
pub_obj.book_set.all().values("name","price")

 

 

外键 关联可以不加引号,但是一定要放在上面,不然找不到

#查询记录(filter和 values 都可以双下划线__)

#人民出版社出版过的书籍与价格
ret=Book.objects.filter(publish__name="人民出版社").values("name","price")

#python这本书出版社的名字
ret2=Publish.objects.filter(book__name="python").values("name")

#python这本书出版社的名字
ret3=Book.objects.filter(name="python").values("publish__name")

#python这本书出版社的名字
ret3=Book.objects.filter(name="python").values("publish__name")

#北京的出版社出版书的名字
ret4=Book.objects.filter(publish__city="北京").values("name")

#2017年上半年出版过书的出版社的名字
ret5=Book.objects.filter(pub_date__lt="2017-07-01",pub_date__gt="2017-01-01").values("publish__name")

 多对多关系:

2张表,建立外键

authors=models.ManyToManyField("Author")


书籍对象它的所有关联作者 obj=book_obj.authors.all()
绑定多对多的关系 obj.add(*QuerySet)
obj.remove(author_obj)



第二种方法 不用ManyToManyField,自己创建第三张表
通过2次ForeignKey建立关系


如果想向第三张表插入值的方式绑定关系: 手动创建第三张表

# class Book_Author(models.Model):
# book=models.ForeignKey("Book")
# author=models.ForeignKey("Author")
Book_Author.objects.create(book_id=2,author_id=3)


掌握:通过 filter values (双下换线)进行多对多的关联查询(形式和一对多)

聚会查询

<1> aggregate(*args,**kwargs):

通过对QuerySet进行计算,返回一个聚合值的字典。aggregate()中每一个参数都指定一个包含在字典中的返回值。即在查询集上生成聚合。

如果你也想知道所有图书价格的最大值和最小值,可以这样查询:
>>> Book.objects.aggregate(Avg('price'), Max('price'), Min('price'))

 annotate(*args,**kwargs):

可以通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合。

前面是单词查询,不能进行组合            

F查询

# models.Tb1.objects.update(num=F('num')+1)要用F包起来才能进行进行计算

Q查询
有Q函数可以进行组合查询
# 2、可以组合使用&,|操作符,当一个操作符是用于两个Q的对象,它产生一个新的Q对象。
    Q(title__startswith='P') | Q(title__startswith='J')

    # 3、Q对象可以用~操作符放在前面表示否定,也可允许否定与不否定形式的组合
    Q(title__startswith='P') | ~Q(pub_date__year=2005)









posted @ 2018-12-21 11:38  一棵大树一棵小树一棵草  阅读(169)  评论(0编辑  收藏  举报