from django.db import models

# Create your models here.
# 书
class Book(models.Model):
title = models.CharField(max_length=32)
publish_date = models.DateField(auto_now_add=True)
price = models.DecimalField(max_digits=5, decimal_places=2)
memo = models.TextField(null=True)
# 创建外键,关联publish
publisher = models.ForeignKey(to="Publisher", on_delete=models.CASCADE, related_name='books')
# 创建多对多关联author
author = models.ManyToManyField(to="Author") def __str__(self):
return self.title # 出版社
class Publisher(models.Model):
name = models.CharField(max_length=32)
city = models.CharField(max_length=32) def __str__(self):
return self.name # 作者
class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
phone = models.CharField(max_length=11)
detail = models.OneToOneField(to="AuthorDetail", on_delete=models.CASCADE) def __str__(self):
return self.name # 作者详情
class AuthorDetail(models.Model):
addr = models.CharField(max_length=64)
email = models.EmailField()

表结构:

练习:

import os

if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite05.settings") import django
django.setup()
# 在设置好环境变量以及导入Django项目之后才能找到Django项目下的APP
# 所以必须要在这里导入
from app import models # 查找某个出版社关联的所有的书籍---反向查找
# ret = models.Publisher.objects.get(id='2').book_set.all() # 在Book中添加反向操作related_name之后
# ret = models.Publisher.objects.get(id='2').books.all() # 查找书名为七侠五义的出版社的名字
# Book类和Publisher定义的时候调用了__str__方法
# 实例化出类的时候自动打印出相应的名字
# ret = models.Book.objects.get(title='七侠五义').publisher # 查找所有书名里有传奇的书
# ret = models.Book.objects.filter(title__contains='传奇') # 查找出版日期为2017年的书籍
# ret = models.Book.objects.filter(publish_date__year=2017) # 查找出版日期是2018年的书名
# ret = models.Book.objects.filter(publish_date__year=2018).values('title') # 查找价格大于100元的书籍
# ret = models.Book.objects.filter(price__gt=100).values("title", "price") # 查找某字段为空的
# ret = models.Book.objects.filter(memo__isnull=True) # 查找在北京的出版社
# ret = models.Publisher.objects.filter(city='北京') # 查找名字以传奇结尾的书本
# ret = models.Book.objects.filter(title__endswith='传奇').values('title') # 查找作者名字里面带"张"字的作者
# ret = models.Author.objects.filter(name__contains="张") # 查找年龄大于30岁的作者
# ret = models.Author.objects.filter(age__gt=19) # 查找手机号是155开头的作者
# ret = models.Author.objects.filter(phone__startswith='155') # 查找手机号是155开头的作者的姓名和年龄
# ret = models.Author.objects.filter(phone__startswith='155').values('name','age') # 查找书名是"七侠五义"的书的出版社
# 基于对象查找
# ret = models.Book.objects.get(title="七侠五义").publisher # 查找书名是"武林传奇"的书的出版社所在的城市
# ret = models.Book.objects.get(title="武林传奇").publisher.city
# 基于双下滑线的查找方式
# ret = models.Book.objects.filter(title="武林传奇").values("publisher__city") # 查找书名是"武林传奇"的书的出版社的名称
# ret = models.Book.objects.filter(title="武林传奇").values("publisher__name") # 查找书名是"七侠五义"的书的所有作者
# ret = models.Book.objects.filter(title='七侠五义').values('author__name').all() # 查找书名是"武林传奇"的书的作者的年龄
# ret = models.Book.objects.filter(title='七侠五义').values('author__name','author__age').all() # 查找书名是"武林传奇"的书的作者的手机号码
# ret = models.Book.objects.filter(title='武林传奇').values('author__name','author__phone') # 查找书名是"武林传奇"的书的作者的地址
# ret = models.Book.objects.filter(title='武林传奇').values('author__detail__addr') # 查找书名是"武林传奇"的书的作者的邮箱
# ret = models.Book.objects.filter(title='武林传奇').values('author__detail__email') # print(ret)

习题答案

Django框架详细介绍---ORM---图书信息系统专题训练的更多相关文章

  1. Django框架详细介绍---ORM相关操作---select_related和prefetch_related函数对 QuerySet 查询的优化

    Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化 引言 在数据库存在外键的其情况下,使用select_related()和pre ...

  2. Django框架详细介绍---ORM相关操作

    Django ORM相关操作 官方文档: https://docs.djangoproject.com/en/2.0/ref/models/querysets/ 1.必须掌握的十三个方法 <1& ...

  3. Django框架详细介绍---模型---ORM

    一.概述 ORM(Object Relational Mapping),全称:对象关系映射,简单的说就是通过创建类.实例化出对象的方法,使得类.对象.对象的属性能够和数据库中的表.记录.字段意义对应. ...

  4. Django框架详细介绍---中间件(认证)

    一.绪论 在cookie和session的应用中,通过在视图函数内添加装饰器判断用户是否登录,把没有登录的用户请求跳转到登录页面,通过给几个特定视图函数加装饰器实现了这个需求.但是以后添加的视图函数可 ...

  5. Django框架详细介绍---cookie、session、自定义分页

    1.cookie 在HTTP协议介绍中提到,该协议是无状态的,也就是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的 ...

  6. Django框架详细介绍---request对象

    几个重要的函数 1.HttpRequest.get_host() 根据从HTTP_X_FORWARDED_HOST(如果打开 USE_X_FORWARDED_HOST,默认为False和 HTTP_H ...

  7. Django框架详细介绍---视图系统

    Django视图系统 1.什么是视图 在Django中,一个视图函数/类,称为视图.实质就是一个用户自定义的简单函数,用来接收WEB请求并xing响应请求,响应的内容可以是一个HTML文件.重定向.一 ...

  8. Django框架详细介绍---Admin后台管理

    1.Admin组件使用 Django内集成了web管理工具,Django在启动过程中会执行setting.py文件,初始化Django内置组件.注册APP.添加环境变量等 # Application ...

  9. Django框架详细介绍---请求流程

    Django请求流程图 1.客户端发送请求 2.wsgiref是Django封装的套接字,它将客户端发送过来的请求(请求头.请求体封装成request) 1)解析请求数据 2)封装响应数据 3.中间件 ...

随机推荐

  1. c++ 异常 discards qualifiers 丢弃

    src/feedbackservice.cpp:76: error: passing `const ps::spider::urlreceiver::entry::ConfigManager' as ...

  2. GeForce GTX 1080 ti安装记录

    安装GeForce GTX 1080ti 安装GeForce GTX 1080ti,8+8pin需要全接,接4pin就开机显示器上会提示电源线没接完,将显示器线接在显卡上. 设置Win 10 pro ...

  3. Git:git diff 命令详解

    工作目录 vs 暂存区 $ git diff <filename> 意义:查看文件在工作目录与暂存区的差别.如果还没 add 进暂存区,则查看文件自身修改前后的差别.也可查看和另一分支的区 ...

  4. [转帖]Loading Data into HAWQ

    Loading Data into HAWQ Leave a reply Loading data into the database is required to start using it bu ...

  5. python3 使用ldap3来作为django认证后台

    首先先使用ldap3测试ldap服务是否正常 我们先要拿到dc的数据,以及连接ldap的密码,还有搜索的字段(search_filter), 一般来说search_filter 这个是从负责ldap运 ...

  6. opencv利用Cascade Classifier训练人脸检测器

    opencv默认提供了haar特征和lbp特征训练的人脸分类器,但是效果不太好,所以我们可以用opencv提供的跑opencv_traincascade函数来训练一个LBP特征的分类器.(由于open ...

  7. redis在php中的基本使用

    //使用autoload加载相关库,这边重点就是为了require $file; spl_autoload_register(function($class) { $file = __DIR__.’/ ...

  8. 简单的Verilog测试模板结构

    这里记录一下曾经用到的简单的测试模板,如下所示: //timescale `timescale 1ns/1ns module tb_module(); //the Internal motivatio ...

  9. 我的预约订单页面List

    <%@ page language="java" contentType="text/html;charset=UTF-8"%> <%@ ta ...

  10. 把一张图片变成base64

    // image_file可为urlprivate function base64EncodeImage($image_file) { $image_info = getimagesize($imag ...