基于django框架测试开发model模型的开发0531
在应用层有个model.py文件,数据库的操作都写在这个文件中
首先需要引入models
from django.db import models
class User(models.Model):#肯定不是特殊的类
username = models.CharField(null=False,max_length=10) #创建一个username表 字符类型的 非空 255最长
password = models.CharField(null=False,max_length=10) #执行makemigrations user后
# 在 migrations\0001_initial.py,再执行migrate user 数据库会多一张表 名字为 应用名+类名小写
#创建表有修改是最好把生成的文件0001_initial.py删除,因为执行makemigrations user时经常不生效,删除后还不能重新
#创建0001文件,就去数据库中django_migrations中删除记录
#创建表的类型 和条件时什么
#只有CharField需要指定长度 其他不需要,default默认值; null是否为空; max_length最大长度;unique唯一不可重复
# primary_key=True主键非空不重复,choice选项 二维元组如性别0,1
#作者表 作者详情表 一个作者对应一个详情,一个详情对应一个作者 1:1
#出版社 与作者无对应关系
#书 与作者是多对多的关系 一本书可以对应多个作者,一个作者对应多本书
#书和出版社 一个书对应一个出版社 一个出版社对应多个书 1对多关系 外键关系
#建立数据库模型
#作者表
class Author(models.Model):
name = models.CharField(max_length=30,null=False)
#作者详情表
class AuthorDetail(models.Model):
sex = models.IntegerField(choices=((0,'女'),(1,'男')),null=False)
age =models.IntegerField(null=False)
phone_number =models.CharField(max_length=13,null=False,unique=True)
emai = models.EmailField(null=False,unique=True)
author = models.OneToOneField(Author,on_delete=models.CASCADE)#1对1关系,同时指定删除方式
#出版社表
class Pulisher(models.Model):
name = models.CharField(max_length=30,unique=True,null=False)
address = models.CharField(max_length=30, unique=True, null=False)
city = models.CharField(max_length=30, unique=False)
website = models.URLField(max_length=100, unique=True, null=False)
#书籍表 书和出版社是1对多的关系 书和作者是多对多关系需要建立第三张表
class Book(models.Model):
name = models.CharField(max_length=30,unique=True,null=False)
publish_data = models.DateField(null=False)
price = models.FloatField(null=False)
pulisher = models.ForeignKey(Pulisher,on_delete=models.CASCADE)
author = models.ManyToManyField(Author)#添加数据库数据 ORM增删改查 都需要先查找
#先考虑增加
#1⃣️、先启动项目
#执行shell命令 进入到django的控制台了
#2⃣️、编写语句 先引入from user.models import *
#3⃣️、在编写Author(name='李四').save() 类直接复制,调用save()
# 或者这样 实例化一个对象
# author = Author()
# author.name='王五'
# author.save
#以上是利用创建模型对象的方式 创建数据库增的操作
#另一种方式:通过静态方法创建类的实例
#author = Author.objects.create(name='王刘') 直接创建并保存
#1对1 创建表 第一步zhangxiao=Author.objects.create(name='王刘')
#第二步AuthorDetail.objects.create(sex=1,age=18,phone_number=13100000000,emai='23@126.com',author=zhangxiao) 1对1表数据的添加
#1对多:beida =Pulisher.objects.create(name='北大出版社',address='北京朝阳',city='北京',website='www.baidu.com')
#Book.objects.create(name='Java',publish_data='2020-01-01',price=29.00,pulisher=beida)1对多数据的添加
#Book.author.add(zhangxiao) 一本书 多不多关系的添加
# liwu = Author.objects.create(name="礼物")
# liwu_detail = AuthorDetail.objects.create(sex=1,age=90,phone_number=13400000000,emai='132@126.com',author=liwu)
# zhejiang = Pulisher.objects.create(name='浙江出版社',address='北京丰台',city='北京',website='www.sohu.com')
# book1 =Book.objects.create(name='php',publish_data='2020-09-01',price=90.9,pulisher=zhejiang)
# book1.author.add(liwu) 多对多关系增加
#查询
#查询全部:Book.objects.all() 返回的是<QuerySet [<Book: Book object (1)>, <Book: Book object (2)>, <Book: Book object (3)>, <Book: Book object (4)>]>
#取数据
# books = Book.objects.all()
# print(books[0].price)
#过滤查询 只要是查询方法 返回的都是model对象的集合
# Book.objects.filter(id=2)根据筛选添加,过滤出相应数据数据
# # <QuerySet [<Book: Book object (2)>]>
Book.objects.filter(id=2)[0].name 取index=0的数据
Book.objects.filter(id=2).first().name
新增一本书,关联出版社,关联作者
#先查询出版社
p = Pulisher.objects.filter(name = '清华大学出版时')
book2 = Book.objects.create(name='django',publish_data='2019-09-10',price=10.00,pulisher=p.first())
zhangsan = Author.objects.filter(name='张三')
zhangsan = Author.objects.filter(name='张三').first()
book2.author.add(zhangsan)
删除:先查询,后删除 比较危险不建议操作
复杂查询:即查询的其他种类
大于:
Book.objects.filter(price__gte=30)
包含:
Book.objects.filter(name_contains)='python'
price__range=(1,10) 包含1-10
price__in=[1,10] 1或10
日期:
__year __month __day
筛选字段:Book.objects.filter(name__contains='21天放弃').values('price','id')
不等于/不包含:Book.objects.exclude(name__contains='python')
order by 默认升序
Book.objects.all().order_by("price")
倒叙排列:
Book.objects.all().order_by("-price")
Book.objects.all().order_by("-price").reverse()
练习
1.查询id为2的书籍信息,只显示书籍名称
Book.objects.filter(id=2).values("name")
结果
<QuerySet [{'name': '天天'}]>
2.查询所有书籍信息,按出版日期降序排列
Book.objects.all().order_by('-pulish_data')
3.查询出版社所在城市信息,不能重复
Pulisher.objects.all().values("city").distinct()
4.查询所在城市不是北京的出版社名称
Pulisher.objects.exclude(city="北京").values('name')
<QuerySet [{'name': '上海出版社'}]>
5.显示所有姓杨的作者id
Author.objects.filter(name__startswith='张').values('id')
<QuerySet [{'id': 1}]>
联表查询:
Book.objects.filter(publish__data='21天放弃').values('author__name','pulisher__name') 书和作者表的name 书和出版社的name
Book.objects.filter(author__name__startswith='张').values('name')姓张的作者写的书名字
1.查询所有作者的完整信息 author主 author_details外 author__id author__name sex
AuthorDetail.objects.all().values('author__id','author__name', 'sex')
AuthorDetail.objects.filter().values('sex','age','phone_number','email','author__id')
2.查询《21天放弃Python编程》这本书的作者名字,和出版社名称
Book.objects.filter(name='21天放弃Python编程').values('author__name','pulisher__name')
3.查询刘大海(张三)都写过什么书,列出书名
Book.objects.filter(author__name='刘大海').values('name')
4.查询高等教育出版社出版过几本书
Pulisher.objects.filter(name='高等教育出版社出版').count()
5.查询机械工业出版社出版的书的价格 Book.objects.filter(pulisher__name='机械工业').values('name')

浙公网安备 33010602011771号