python34-多表操作

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

复制代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值