models.py
from django.db import models
# Create your models here.
class Book(models.Model):
name=models.CharField(max_length=20)
price=models.IntegerField()
pub_date=models.DateField()
#外键(会自动变为publish_id)
publish=models.ForeignKey("Publish",on_delete=models.CASCADE,)
#多对多
authors=models.ManyToManyField("Author")
def __str__(self):
return self.name
class Publish(models.Model):
name=models.CharField(max_length=32)
city=models.CharField(max_length=32)
def __str__(self):
return self.name
#第三张表
# class Book_Author(models.Model):
# book=models.ForeignKey("Book",on_delete=models.CASCADE,)
# author=models.ForeignKey("Author",on_delete=models.CASCADE,)
class Author(models.Model):
name=models.CharField(max_length=32)
age=models.IntegerField(default=20)
def __str__(self):
return self.name
复制代码
urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.index),
path('addbook/', views.addbook),
path('update/', views.update),
path('delete/', views.delete),
path('select/', views.select),
]
复制代码
settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'ORM_multi', #你的数据库名称
'USER': 'root', #你的数据库用户名
'PASSWORD': 'root', #你的数据库密码
'HOST': '', #你的数据库主机,留空默认为localhost
'PORT': '3306', #你的数据库端口
}
}
复制代码
views.py
from django.shortcuts import render,HttpResponse
from django.db.models import Avg,Min,Sum,Max,Count
from django.db.models import Q,F
from app01.models import *
# Create your views here.
def index(req):
return render(req,"index.html")
def addbook(req):
#添加
#第一种方式
#Book.objects.create(name="linux运维",price=66,pub_date="2018-03-24",publish_id=2)
#第二种方式
#publish_obj=Publish.objects.filter(name="人民出版社")[0]
#Book.objects.create(name="GO", price=23, pub_date="2018-03-25", publish=publish_obj)
#查询记录(通过对象)
#查询书对应的出版社(正向查询)
# book_obj=Book.objects.get(name="python")
# #一对多 book_obj.publish----------------一定是一个对象
# print(book_obj.publish.name)
# print(book_obj.publish.city)
#查询人民出版社出过的所有书籍名字和价格(反向查询)
#方式一:
# pub_obj=Publish.objects.filter(name="人民出版社")[0]
# ret =Book.objects.filter(publish=pub_obj).values("name","price")
# print(ret)
#方式二
# pub_obj=Publish.objects.filter(name="人民出版社")[0]
# #书的集合(固定写法book_set)
# print(pub_obj.book_set.all().values("name","price"))
# 查询记录(通过__)
#查询人民出版社出过的所有书籍名字和价格
# ret =Book.objects.filter(publish__name="人民出版社").values("name","price")
# print(ret)
# 查询书对应的出版社名字
#第一种方式
# ret1 =Publish.objects.filter(book__name="python").values("name")
# print(ret1)
#第二种方式
# ret2 =Book.objects.filter(name="python").values("publish__name")
# print(ret2)
#查询北京出版社出版的所有的书
# ret3 = Book.objects.filter(publish__city="北京").values("name")
# print(ret3)
#按照时间查询(查询2018年上半年的书对应的出版社)
# ret4= Book.objects.filter(pub_date__lt="2018-06-11",pub_date__gt="2018-01-01").values("publish__name")
# print(ret4)
#通过对象的方式绑定关系
#正向查找
# book_obj=Book.objects.get(id=3)
#书籍对应的所有作者
# print(book_obj.authors.all())
#反向查找
# author_obj=Author.objects.get(id=2)
# print(author_obj.book_set.all())
#book_obj=Book.objects.get(id=3)
# 书id=3添加对应作者id=2
#author_objs = Author.objects.get(id=2)
# book_obj.authors.add(author_objs)
# 书id=3添加对应所有作者
#author_objs=Author.objects.all()
#book_obj.authors.add(*author_objs)
#书id=3删除对应所有作者
# author_objs = Author.objects.all()
# book_obj.authors.remove(*author_objs)
#删除书id=3作者id=2
#book_obj.authors.remove(1)
#创建第三张表(手动)
#Book_Author.objects.create(book_id=2,author_id=2)
#对象查询
#obj=Book.objects.get(id=2)
#Book_Author
#print(obj.book_author_set.all()[0].author)
#print("sssssssssssssssssss",obj.book_author_set.all()[0])
#alex出过的书籍名称和价格
# ret=Book.objects.filter(book_author__author__name="alex").values("name","price")
# print(ret)
# ret = Book.objects.filter(authors__name="alex").values("name","price")
# print(ret)
#聚合查询和分组查询
#所有书的价格
# 平均值
#ret=Book.objects.all().aggregate(Avg("price"))
# 和
#ret=Book.objects.all().aggregate(Sum("price"))
# alex书的总价格(自定义别名 alex_money )
# ret=Book.objects.filter(authors__name="alex").aggregate(alex_money=Sum("price"))
# print(ret)
#alex书的数量
#ret = Book.objects.filter(authors__name="alex").aggregate(Count("name"))
#print(ret)
#分组
#每一个作者对应写的书的总价格
# ret=Book.objects.values("authors__name").annotate(Sum("price"))
# print(ret)
#每个出版社对应的最便宜的书的价格
# ret=Publish.objects.values("name").annotate(Min("book__price"))
# print(ret)
#多个条件(并且) and
# b=Book.objects.get(name="GO",price=66)
# print(b)
#所有书提升10块钱
# Q F
#Book.objects.all().update(price=F("price")+10)
# 或者 通过Q
# ret=Book.objects.filter(Q(price=96)|Q(name="GO"))
# print(ret)
#组合
# ret = Book.objects.filter(Q(price=96) |~ Q(name="GO"))
# print(ret)
#非
# ret = Book.objects.filter(~ Q(name="GO"))
# print(ret)
# 包含
# ret = Book.objects.filter(~ Q(name__contains="G"))
# print(ret)
#包含
# ret = Book.objects.filter(Q(name__contains="G"))
# print(ret)
#注意顺序
# ret=Book.objects.filter(Q(name="GO"),price=96)
# print(ret)
#执行这一句的时候数据库并没有查询(用的时候再执行--惰性--)
ret=Book.objects.filter(price=96)
#判断是否有数据
if ret.exists():
print("ok")
#节约内存
#迭代器对象(只能便利一次)
ret=ret.iterator()
print(ret)
for i in ret:
print(i.name)
#没有值
for i in ret:
print(i.name)
return HttpResponse("保存成功")
def update():pass
def delete():pass
def select():pass
复制代码
表