单表查询
#增(方式1)
# models.User.objects.create(name='lz',age=16,register_time='2022-11-1')
# #(方式2)
# import datetime
# ctime = datetime.datetime.now()
# user_obj = models.User(name='kk',age=19,register_time=ctime)
# user_obj.save()
#删(方式1)
# res = models.User.objects.filter(pk=2).delete()
# print(res)
'''
pk会自动查找到当前表的主键字段,指代的就是当前表的主键字段
用pk后,就不需要知道当前主键字段到底叫什么了
'''
#(方式2)
# user_obj = models.User.objects.filter(pk=1).first()
# user_obj.delete()
#修改(方式1)
# models.User.objects.filter(pk=4).update(name='lzDSB')
#(方式2)
# user_obj = models.User.objects.get(pk=4)
# user_obj.name = 'lzDS'
# user_obj.save()
'''
get 方法返回的直接就是当前对象,但是该方法不推荐使用
因为一旦数据不存在直接报错,而filter不会
'''
测试脚本
'''
当你只是想测试django中某一个晚间内容,那不用书写前后端交互的形式,
而是直接写一个测试脚本即可
'''
#测试环境的准备,去manage.py中拷贝几行代码,在写两行代码
import os
if __name__ == '__main__':
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day64_django.settings')
import django
django.setup()
from app01 import models
models.User.objects.all()
查看内部SQL语句的方式
#方式1
res = models.User.objects.values_list('name','age')
print(res.query) #<QuerySet [('kk', 19), ('lzDS', 16)]>
queryset对象才能点击query查看内部的SQL语句
#方式2:所有的SQL语句都能查看
#去配置文件配置以下代码
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'simple': {
'format': '[%(asctime)s] %(message)s'
},
},
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
},
'loggers': {
'django': {
'handlers': ['console'],
'level': 'DEBUG',
},
},
}
表
from django.db import models
# Create your models here.
class User(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
register_time = models.DateField() #年月日
'''
DateField
DateTimeField
两个重要参数
auto_now:每次操作数据的时候,该字段会自动将当前时间更新
auto_now_add:在创建数据的时候会自动将当前时间记录下来,
之后只要不人为修改,数据不会变(注册)
'''
#
# def __str__(self):
# return '对象:%s'%self.name
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8,decimal_places=2)
publish_date = models.DateField(auto_now_add=True)
#一对多
publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE)
#多对多
author = models.ManyToManyField(to='Author')
class Publish(models.Model):
name = models.CharField(max_length=32)
addr = models.CharField(max_length=64)
email = models.EmailField()
def __str__(self):
return '对象:%s'%self.name
class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
#一对一
author_detail = models.OneToOneField(to='AuthorDetail',on_delete=models.CASCADE)
class AuthorDetail(models.Model):
phone = models.BigIntegerField() #号码用BigIntegerFiled或者用CharFiled
addr = models.CharField(max_length=64)
#必知必会13条(表名为User)
#1、all() 查询所有数据
#2、filter()带有过滤条件
#3、get() 直接那数据对象,数据不存在报错
#4、first() 那queryset里面第一个元素
# res = models.User.objects.all().first()
# print(res)
#5、last()
# res = models.User.objects.all().last()
# print(res)
#6、values() 可以指定获取的数据字段,select name,age from ... 列表套字典
# res = models.User.objects.values('name','age')
# print(res) #<QuerySet [{'name': 'kk', 'age': 19}, {'name': 'lzDS', 'age': 16}]>
#7、values_list() 列表套元组
# res = models.User.objects.values_list('name','age')
# print(res) #<QuerySet [('kk', 19), ('lzDS', 16)]>
#8、distinct() 去重
# res = models.User.objects.values('name','age').distinct()
# print(res)
'''
去重一定是一模一样的数据,如果带有主键数据肯定不一样(不能忽略主键)
'''
#9、order_by() 排序
# res = models.User.objects.order_by('age') #默认升序
# res = models.User.objects.order_by('-age') #降序(加负号)
# print(res)
#10、reverse() 反转 前提是已经排序过,可以跟在order_by后面
#11、count() 统计当前User表的数据个数
# res = models.User.objects.count()
# print(res)
#12、exclude() 除了
# res = models.User.objects.exclude(name='lz')
# print(res)
#13、exists() 返回布尔值
# res = models.User.objects.filter(pk=4).exists()
# print(res)
下划线查询
#双下划线查询
#大于19岁
# res = models.User.objects.filter(age__gt=19)
# print(res)
#小于(lt)
#大于等于(gte)小于等于(lte)
# res = models.User.objects.filter(age__gte=19)
# print(res)
#年龄是16或者23或者37
# res = models.User.objects.filter(age__in=[16,23,37])
# print(res)
#年龄在19-37(首尾都要)
# res = models.User.objects.filter(age__range=[19,37])
# print(res)
#查询名字有z的数据(区分大小写)
# res = models.User.objects.filter(name__contains='z')
# print(res)
#忽略大小写(在contains前面加i)
# res = models.User.objects.filter(name__icontains='d')
# print(res)
#查询l开头(startswith)结尾(endswith)
# res = models.User.objects.filter(name__startswith='l')
# print(res)
#查询出注册时间为2022年 5月
# res = models.User.objects.filter(register_time__year='2022')
# print(res)
# res = models.User.objects.filter(register_time__month='5')
# print(res)
#两个一起查
# res = models.User.objects.filter(register_time__year='2022')\
# and models.User.objects.filter(register_time__month='5')
# print(res)
多表增删改查
#一对多外键增删改查
#增
#方式1
# models.Book.objects.create(title='论语',price=899.45,publish_id=1)
# models.Book.objects.create(title='计算机网络',price=89.89,publish_id=1)
# models.Book.objects.create(title='大数据',price=19.40,publish_id=2)
# models.Book.objects.create(title='linux',price=189.23,publish_id=1)
# models.Book.objects.create(title='python',price=99.45,publish_id=2)
#方式2
# publish_obj = models.Publish.objects.filter(pk=2).first()
# models.Book.objects.create(title='红楼梦',price=234.56,publish=publish_obj)
#删
# models.Publish.objects.filter(pk=1).delete() #联级删除
#修改
# models.Book.objects.filter(pk=1).update(publish_id=2)
# publish_obj = models.Publish.objects.filter(pk=1).first()
# models.Book.objects.filter(pk=1).update(publish=publish_obj)
#多对多增删改查 就是在操作第三张表
#增
book_obj = models.Book.objects.filter(pk=2).first()
# # book_obj.author.add(1)
# book_obj.author.add(2,3)
# book_obj = models.Book.objects.filter(pk=2).first()
# book_obj.author.add(1)
# book_obj.author.add(2,3)
# author_obj = models.Author.objects.filter(pk=2).first()
# author_obj1 = models.Author.objects.filter(pk=3).first()
# book_obj.author.add(author_obj,author_obj1)
'''
add给第三张表添加数据
括号内既可以传数字也可以传参数,并且支持多个
'''
#删
# book_obj.author.remove(2)
# book_obj.author.remove(1,3)
# author_obj = models.Author.objects.filter(pk=2).first()
# author_obj1 = models.Author.objects.filter(pk=3).first()
# book_obj.author.remove(author_obj,author_obj1)
'''
remove
括号内既可以传数字也可以传参数,并且支持多个
'''
#修改set
# book_oj.author.set([2,2])
# book_obj.author.set([3])
# author_obj = models.Author.objects.filter(pk=2).first()
# author_obj1 = models.Author.objects.filter(pk=3).first()
# book_obj.author.set([author_obj,author_obj1])
'''
set
括号内必须传一个可迭代对象,该对象内既可以数字也可以是对象,并且支持多个
'''
#清空
#在第三张表中清空某一个书籍与作者的绑定关系
# book_obj.author.clear()
'''
括号内不要加如何参数
'''
正反向的概念
book(外键在书这边)>>>publish 正向
publish(外键在数这边)>>>book 反向
'''
正向查询按字段,反向查询按表名小写
'''
多表查询
子查询(基于对象的跨表查询)
#基于对象的跨表查询
#1、查询书籍主键为1的出版社
# book_obj = models.Book.objects.filter(pk=1).first()
# #书查出版社 正向
# res = book_obj.publish
# print(res)
# print(res.name)
# print(res.addr)
#2、查询书籍为1的作者(正向)
# book_obj = models.Book.objects.filter(pk=1).first()
# res = book_obj.author.all()
# print(res)
#3、查询作者lz的电话号码(正向)
# author_obj = models.Author.objects.filter(name='lz').first()
# res = author_obj.author_detail
# print(res)
# print(res.phone)
# print(res.addr)
'''
正向查询
当你查询结果可能有多条的时候要加.all()
book_obj.publish
book_obj.author.all()
author_obj.author_detail
'''
#4、查询出版社是东方出版社出版的书
# publish_obj = models.Publish.objects.filter(name='东方出版社').first()
#出版社查书 反向
# res = publish_obj.book_set #app01.Book.None(看到这个在后面加all())
# res = publish_obj.book_set.all()
# print(res)
#5、查询作者是lz的书
# author_obj = models.Author.objects.filter(name='lz').first()
#作者查书 反向
# res = author_obj.book_set #app01.Book.None
# res = author_obj.book_set.all()
# print(res)
# #6、查询手机号为110的作者姓名
# author_detail_obj = models.AuthorDetail.objects.filter(phone=110).first()
# res = author_detail_obj.author
# print(res.name)
'''
当你查询结果有多个数据时候要加_set.all()
publish_obj.book_set.all()
author_obj.book_set.all()
author_detail_obj.author
'''
下划线联表查询
#1、查询lz的手机号和作者名字(正向)
# res = models.Author.objects.filter(name='lz').values('author_detail__phone','name')
# print(res)
#反向
# res = models.AuthorDetail.objects.filter(author__name='lz') #作者名字是lz的作者详情
# res = models.AuthorDetail.objects.filter(author__name='lz').values('phone','author__name')
# print(res)
#2、查询书籍主键为1的出版社名称和书的名字(正向)
# res = models.Book.objects.filter(pk=1).values('title','publish__name')
# print(res)
#反向
# res = models.Publish.objects.filter(book__pk=1).values('name','book__title')
# print(res)
#3、查询书籍主键为1 的作者姓名 正向
# res = models.Book.objects.filter(pk=1).values('author__name')
# print(res)
#反向
# res = models.Author.objects.filter(book__pk=1).values('name')
# print(res)
#查询书籍主键是1的作者的手机号
#book author author_detail
res = models.Book.objects.filter(pk=1).values('author__author_detail__phone')
print(res)