zoukankan      html  css  js  c++  java
  • Python学习第三十二课——ORM(多表查询,一对多)

    多表查询首先要建立外键:

    models.py(重要):

    from django.db import models
    
    
    # Create your models here.
    
    
    # 一对多建表
    class Book(models.Model):  # 表名
        name = models.CharField(max_length=20)  # name字段
        price = models.IntegerField()  # 字段
        pub_date = models.DateField()  # 字段
        publish = models.ForeignKey("Publish", on_delete=models.CASCADE) #Publish 是下面的类
    
        def __str__(self):
            return self.name
    
    
    class Publish(models.Model):
        # 一个出版社可以出多本书,按道理一般将外键建立到多的一方
        name = models.CharField(max_length=32)
        city = models.CharField(max_length=32)
    
    
    class Author(models.Model):
        name = models.CharField(max_length=32)
        age = models.IntegerField()

    urls和HTML和上一章一样,此处省略!!!

    views.py(核心代码):

    from django.shortcuts import render, HttpResponse
    
    # Create your views here.
    from ap05.models import *
    
    
    def index(request):
        return render(request, "index.html")
    
    
    # 一对多的添加数据方法一:
    # def addbook(request):
    #     # 如果有外键,要加上外键的名字,而不是你创建的名字 系统默认在你创建外键名字后面加_id
    #     Book.objects.create(name="linux", price=120, pub_date="2017-1-1", publish_id=2)
    #     return HttpResponse("添加成功")
    
    # 一对多的添加数据方法二:
    def addbook(request):
        # 如果害怕出错,想用自己起的外键名字的话,就用方法二
        # public_obj=Publish.objects.get(name="北京出版社")
        # public_obj = Publish.objects.filter(name="北京出版社")[0] # filter返回的是一个集合
        # Book.objects.create(name="GIS", price=130, pub_date="2001-2-5", publish=public_obj) # 此时外键是自己起的名字
    
        # 根据书名查该书所对应的出版社
        bool_obj = Book.objects.get(name="python")  # 先按照书名查一条记录
        # print(bool_obj.name)
        # print(bool_obj.price)
    
        print(bool_obj.publish.name)  # 中国邮电出版社
        print(bool_obj.publish.city)  # 北京
        print(type(bool_obj.publish))  # .publish就是Publish对象
    
        # 查询北京出版社出过的所有书籍
        # 方法一:正向查询
        # pub_obj=Publish.objects.filter(name="北京出版社")[0]
        # ret=Book.objects.filter(publish=public_obj).values("name","price")
        # print(ret)
    
    
        # #方法二:反向查询
        # pub_obj=Publish.objects.filter(name="北京出版社")[0]
        # print(pub_obj.book_set.all()) # <QuerySet [<Book: JAVA>, <Book: C++>, <Book: C++>, <Book: GIS>, <Book: GIS>]>
        # print(pub_obj.book_set.all().values("name","price"))
        # print(type(pub_obj.book_set.all()))
        #
        return HttpResponse("添加成功")
    
    
    def update(request): pass
    
    
    def delete(request): pass
    
    
    def select(request):
        # 方法二:反向查询
        pub_obj = Publish.objects.filter(name="北京出版社")[0]
        # print(pub_obj.book_set.all())  # <QuerySet [<Book: JAVA>, <Book: C++>, <Book: C++>, <Book: GIS>, <Book: GIS>]>
        book_list=pub_obj.book_set.all().values("name", "price")
    
        return render(request,"index.html",{"book_list1":book_list})
  • 相关阅读:
    获取地址栏数据
    tag标签添加删除并把值存入到一个input的value内
    美化 input type=file控件
    高效的数组去重(js)
    原生js动态改变dom高度
    html5 postMessage解决跨域、跨窗口消息传递
    移动前端制作篇之javascript篇
    js中的事件委托
    图片轮播(定时播放)
    潭州课堂25班:Ph201805201 django 项目 第四十一课 后台 轮播图管理功能讲解,文档管理功能 实现 (课堂笔记)
  • 原文地址:https://www.cnblogs.com/pyhan/p/12402916.html
Copyright © 2011-2022 走看看