1、多表操做之一对多
from django.db import models
class Book(models.Model):
name = models.CharField(max_length=30)
price = models.FloatField()
pub_date = models.DateField()
publish = models.ForeignKey('Publish',on_delete='CASCADE') #外键关联
def __str__(self):
return self.name
# 做者和书的关系是多对多的关系
class Author(models.Model):
name = models.CharField(max_length=20)
# 书和出版社的表是一对多的关系
class Publish(models.Model):
name = models.CharField(max_length=32)
city = models.CharField(max_length=32)
一、插入数据
Book.objects.create(name="Liunx运维手册",price=99,pub_date="2018-08-08",publish_id=2) #直接对外键_id赋值
publish_obj = Publish.objects.filter(name="人民出版社")[0]
Book.objects.create(name="Liunx运维手册2版",price=199,pub_date="2019-08-08",publish=publish_obj) #直接对外键赋值
二、查询数据
# 查询书籍是由哪一个出版社出版的,正向查询
book_obj = Book.objects.get(name="python")
print(book_obj.name)
print(book_obj.pub_date)
print(book_obj.publish.name) #一对多中必定是一个对象
print(book_obj.publish.city)
print(type(book_obj.publish))
# 查询出版社出过哪些书籍,反向查询
pub_obj = Publish.objects.get(name="人民出版社")
print(pub_obj.book_set.all().values("name","price")) #多对一查到的是一个集合
# 查询出版社出过哪些书
ret = Book.objects.filter(publish__name="人民出版社").values("name","price")
print(ret)
# 查询书的出版社
ret = Publish.objects.filter(book__name="python").values("name")
print(ret)
ret = Book.objects.filter(name="python").values("publish__name")
print(ret)
2、多表操做之多对多(自动维护多对多关系表)
from django.db import models
# Create your models here.
class Book(models.Model):
name = models.CharField(max_length=30)
price = models.FloatField()
pub_date = models.DateField()
publish = models.ForeignKey('Publish',on_delete='CASCADE') #外键关联
authors = models.ManyToManyField("Author") #建立表多对多的关系
def __str__(self):
return self.name
# 做者和书的关系是多对多的关系
class Author(models.Model):
name = models.CharField(max_length=20)
age = models.IntegerField(default=0)
def __str__(self):
return self.name
# 书和出版社的表是一对多的关系
class Publish(models.Model):
name = models.CharField(max_length=32)
city = models.CharField(max_length=32)
一、数据查找
# 经过对象的方式建立多对多的绑定关系
book_obj = Book.objects.get(id=3)
print(book_obj.authors.all()) #这里拿到的authors是书对应做者的对象
author_obj = Author.objects.get(id=2)
print(author_obj.book_set.all())
ret = Book.objects.filter(authors__name="maria").values("name","price")
print(ret)
二、添加对应关系
book_obj = Book.objects.get(id=5) #获取书的对象
author_objs = Author.objects.get(id=3) #获取做者的对象
book_obj.authors.add(author_objs) #将做者对象加入到书的对应做者对象中,若是author_objs是一个集合则须要book_obj.authors.add(*author_objs)这样写
三、删除对应关系
book_obj = Book.objects.get(id=5)
author_objs = Author.objects.get(id=3)
book_obj.authors.remove(author_objs)
3、多表操做之多对多(手动维护多对多关系表)
from django.db import models
# Create your models here.
class Book(models.Model):
name = models.CharField(max_length=30)
price = models.FloatField()
pub_date = models.DateField()
publish = models.ForeignKey('Publish',on_delete='CASCADE') #外键关联
# authors = models.ManyToManyField("Author") #建立表多对多的关系
def __str__(self):
return self.name
# 做者和书的关系是多对多的关系
class Author(models.Model):
name = models.CharField(max_length=20)
age = models.IntegerField(default=0)
def __str__(self):
return self.name
# 建立做者和书的关系绑定表
class Book_Author(models.Model):
book = models.ForeignKey("Book",on_delete="CASCADE")
author = models.ForeignKey("Author",on_delete="CASCADE")
# 书和出版社的表是一对多的关系
class Publish(models.Model):
name = models.CharField(max_length=32)
city = models.CharField(max_length=32)
Book_Author.objects.create(book_id=1,author_id=2)
obj = Book.objects.get(id=1)
print(obj.book_author_set.all()[0].author)
ret = Book.objects.filter(book_author__author__name='maria').values("name","price")
print(ret)
4、聚合和分组查询
from django.db.models import Avg,Min,Sum,Max,Count
print(Book.objects.all().aggregate(Avg("price"))) #求平均值
print(Book.objects.all().aggregate(Sum("price"))) #求和
print(Book.objects.filter(authors__name="maria").aggregate(Sum("price"))) #求和
print(Book.objects.filter(authors__name="maria").aggregate(Count("name")))
print(Book.objects.values("authors__name").annotate(Sum("price"))) #按照author_name分组后将price作求和
print(Publish.objects.values("name").annotate(Min("book__price")))
from django.db.models import Avg,Min,Sum,Max,Count,F
Book.objects.all().update(price=F("price")*2) #将书的价格翻一倍
from django.db.models import Avg,Min,Sum,Max,Count,F,Q
print(Book.objects.filter(Q(price=178)|Q(name="python"))) #或
print(Book.objects.filter(Q(price=178)| ~Q(name="python"))) #或非