zoukankan      html  css  js  c++  java
  • 基于对象的orm跨表查询再练习

    model.py

    from django.db import models
    
    
    # Create your models here.
    
    class Book(models.Model):
        nid = models.AutoField(primary_key=True)
        title = models.CharField(max_length=64)
        publishDate = models.DateField()
        price = models.DecimalField(max_digits=5, decimal_places=2)
    
        publish = models.ForeignKey(to="Publish", to_field="nid", on_delete=models.CASCADE)
    
        authors = models.ManyToManyField(to="Author")
    
    
    class Author(models.Model):
        nid = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32)
        age = models.IntegerField()
        # 作者和作者信息一对一
        AuthorDetail=models.OneToOneField(to="AuthorDetail",on_delete=models.CASCADE)
    
    
    class AuthorDetail(models.Model):
        nid = models.AutoField(primary_key=True)
        # birthday = models.DateField()  如果报错 Python int too large to convert to C long 则注销这行
        tetephone = models.BigIntegerField()
        addr = models.CharField(max_length=64)
    
    
    class Publish(models.Model):
        nid = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32)
        city = models.CharField(max_length=32)
        email = models.EmailField()

    views.py

    from django.shortcuts import render
    
    # Create your views here.
    from django.shortcuts import HttpResponse, redirect, render
    from .models import Book, Author, AuthorDetail, Publish
    
    
    def index(request):
    
        ''' 一(出版社)对多(书籍) 查询 '''
    
        # 1、(正向查询按字段) 查询主键为1的书籍的出版社所在的城市
        book_obj=Book.objects.get(pk=1)
        print(book_obj.publish.city)
    
        # 2、(反向查询)查询 苹果出版社 出版的所有书籍的名字(反向查询按表名小写)
        #  “要查询的表_set”  就是反向查询所要查询的关联表数据
        publish_obj=Publish.objects.get(name="苹果出版社")
        print(publish_obj.city)
        book_list=publish_obj.book_set.all()
        print(book_list)
        for item in book_list:
            print(item.title)
    
        '''  一(作者)对一(作者详情)查询 '''
        # 1、反向查询  查询所有住址在北京的作者的姓名(通过authordetail去查询author表)
        author_detail_list=AuthorDetail.objects.filter(addr="北京").all()
        print(author_detail_list)
        for item in author_detail_list:
            print(item.author.name)
    
        # 2、正向查询 查询作者为tom的地址在哪里?
        author_obj=Author.objects.get(name="tom")
        print(author_obj) # Author object (1)
        print(author_obj.AuthorDetail)  # AuthorDetail object (1)
        print(author_obj.AuthorDetail.addr) # 北京
    
        '''多(Author)对多(Book)查询'''
        # 正向查询
        # 1、追风筝的人  所有作者的名字以及手机号
        book_obj=Book.objects.get(title="追风筝的人")
        print(book_obj) # Book object (3)
        author_list=book_obj.authors.all()
        print(author_list)  # <QuerySet [<Author: Author object (1)>, <Author: Author object (2)>]>
        for author_obj in author_list:
            print(author_obj) # Author object
            print(author_obj.name)
            print(author_obj.AuthorDetail.addr) # 再跨一张authordetail表
    
        # 2、反向查询 查询tom出过的所有书籍的名字
        author_obj=Author.objects.get(name="tom")
        print(author_obj) # Author object (1)
        book_list=author_obj.book_set.all()
        print(book_list) # <QuerySet [<Book: Book object (3)>, <Book: Book object (1)>]>
        for book_obj in book_list:
            print(book_obj.title)
    
    
    
        return HttpResponse("ok")
  • 相关阅读:
    微信小程序在sublime开发代码高亮显示
    CSS之flex兼容
    本地存储(2)
    IE浏览器兼容性问题解决方案
    设计一套方案,解决不同浏览器的兼容问题(2)
    Webpack, 现在最流行的模块打包工具.压缩打包
    Linux环境下安装配置Node.js
    阿里云服务器 linux 怎么安装php(PHPSTUDY)开发环境
    函数与闭包
    内建的控制结构
  • 原文地址:https://www.cnblogs.com/one-tom/p/12073412.html
Copyright © 2011-2022 走看看