目录
前置条件
在app下的model.py中建表
from django.db import models
# Create your models here.
class Nav(models.Model):
name = models.CharField(max_length=10, unique=True, verbose_name='导航名称')
is_delete = models.SmallIntegerField(default=1, verbose_name='是否被删除') # 1代表未删除,0代表删除(物理删除)
create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True) # auto_now_add插入数据的时候自动取当前时间
update_time = models.DateTimeField(verbose_name='修改时间', auto_now=True) # 修改数据的时候,时间会变
def __str__(self): # 查询时指定返回name,否则返回的是看不懂的对象
return self.name
class Meta: # 必须叫这个名字
verbose_name = '导航表'
verbose_name_plural = verbose_name
db_table = 'nav' # 默认会使用类名_类名,当做表名,若是不想使用默认的,可以自己指定表名
# ordering = ['update_time'] # 查询数据库的时候,用来排序的
在model.py的同级目录创建model_test.py文件,用于测试操作数据库
操作数据库的测试文件
# models.py文件
import django,os
os.environ.setdefault('DJANGO_SETTINGS_MODULE','dj_blog.settings') # 设置Django的配置文件,第二个参数为自己的项目名称.settings
django.setup()
# 必须先写上以上几行代码,以上代码可以实现右键操作model(操作数据库)
from blog import models # 导入要查询的app下方的models模块
from django.db.models import Q # 导入Q模块,用于或条件查询
DJango对数据库增删改查
单表
新增
# 新增数据的两种方式
models.Nav.objects.create(name='我的日记3')
nav_obj = models.Nav(name = '我的心情3') # 实例化
nav_obj.save()
查询
get()方法:只支持单条结果精确查询
# get方法查询,必须保证查询出来只有一条,否则报错
result = models.Nav.objects.get(id=1) # 查询出來是一个对象,可以.属性取值
print(result)
print(result.name)
print(result.create_time)
filter()方法:支持多条件查询,支持多结果接收
result2 = models.Nav.objects.filter(is_delete=1) # 查询所有is_delete=1的数据
# 与查询
result3 = models.Nav.objects.filter(is_delete=1,name='我的心情') # 查询所有is_delete=1且name='我的心情'的数据,多个and条件用逗号分隔即可
print(result2)
print(result3)
# 或查询
result11 = models.Nav.objects.filter(Q(id__contains='6')|Q(id__contains='3'))
print(result11)
filter()方法:模糊查询
# 模糊查询,__gt代表大于,__gte代表大于等于,__lt代表小于,__lte代表小于等于,__range查询指定范围的数据,id__in查询包含指定值的数据
result4 = models.Nav.objects.filter(name__contains='我的',id__gt=1)
result5 = models.Nav.objects.filter(name__contains='我的',id__gte=1)
result6 = models.Nav.objects.filter(name__contains='我的',id__lt=4)
result7 = models.Nav.objects.filter(name__contains='我的',id__lte=6)
result8 = models.Nav.objects.filter(id__range=[1,5])
result9 = models.Nav.objects.filter(id__in=[1,2,3,5])
print(result4)
print(result5)
print(result6)
print(result7)
print(result8)
print(result9)
# 可以无限.filter,.exclude。下边这个例子的意思是先排除name中包含博客的内容,然后剩下的数据在过滤name包含我的的内容,然后再排除name中包含1的内容
result12 = models.Nav.objects.exclude(name__contains='博客').filter(name__contains='我的').exclude(name__contains='1')
print(result12)
fitst()方法:返回一个字符串形式的对象,不加的话返回的是QuerySet,见下图
all()方法:查询全部数据
# 查询全部数据
all = models.Nav.objects.all()
print(all)
# all()方法也支持.filter
result13 = models.Nav.objects.all().filter(name='我的日记')
print(result13)
exclude()方法:排除查询,查询除了指定值以外的数据
# exclude()排除,查询除了指定值以外的数据
result10 = models.Nav.objects.exclude(id=1)
print(result10)
修改
# 方式1:单个修改
m = models.Nav.objects.get(id=1) # get(pk=1)同get(id=1),pk代表主键
m.name = '我的日记-修改'
m.is_delete = 0
m.save()
# 方式2:批量修改
models.Nav.objects.filter(name__contains='我的').update(is_delete=0) # 将名字包含我的的数据,的is_delete字段更改为0
models.Nav.objects.all().update(is_delete=1)
删除
# 单个删除
# d = models.Nav.objects.get(id=1) # 删除id为1的数据
# d.delete()
# 批量删除
models.Nav.objects.filter(name__contains='心情').delete()
# 全部删除
# models.Nav.objects.all().delete()
多表
新增
# 向表中插入数据,1对多
navs = models.Nav.objects.all() # 先将Nav表中的数据查出来
for i in navs:
nav = models.Nav.objects.get(name=i)
models.Article.objects.create(title='django教程1',content='django教程11111',nav_id=i.id) # nav_id=i.id等同于nav=i
models.Article.objects.create(title='django教程2',content='django教程11111',nav_id=i.id)
models.Article.objects.create(title='django教程3',content='django教程11111',nav_id=i.id)
models.Article.objects.create(title='django教程4',content='django教程11111',nav_id=i.id)
models.Article.objects.create(title='django教程5',content='django教程11111',nav_id=i.id)
查询(以下两种方法一样)
# 基础查询方法
nav = models.Nav.objects.get(name='我的日记1') # 查询 Nav表中,name='我的日记1'的对象
result = models.Article.objects.filter(nav_id = nav.id) # 查询Article表中,nav_id='我的日记1'对应的id
print(result)
# 查询数据--一对多:外键反向查询方法
nav = models.Nav.objects.get(name='我的日记1')# 查询 Nav表中,name='我的日记1'的对象
result2 = nav.article_set.all()# 查询有外键关联的字段,nav(代表被外键关联的表).article(代表有外键关联的表名)_set分别代表
print(result2)
多对多
前置条件-创建数据库表
from django.db import models
from utils import tools
from earth import settings
class BaseModel(models.Model):
'''公共字段'''
is_delete_choice = (
(0, '删除'),
(1, '正常')
)
is_delete = models.SmallIntegerField(choices=is_delete_choice, default=1, verbose_name='是否被删除')
create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True) # auto_now_add的意思,插入数据的时候,自动取当前时间
update_time = models.DateTimeField(verbose_name='修改时间', auto_now=True) # 修改数据的时候,时间会自动变
class Meta:
abstract = True # 只是用来继承的,不会创建这个表
class Author(BaseModel):
name = models.CharField(verbose_name='名称', max_length=20)
def __str__(self):
return self.name
class Meta:
verbose_name = '作家'
verbose_name_plural = verbose_name
ordering = ['id']
db_table = 'eg_author'
class Book(BaseModel):
name = models.CharField(verbose_name='书名', max_length=20)
price = models.FloatField(verbose_name='价格')
count = models.IntegerField(verbose_name='数量')
# author = models.ForeignKey(Author, on_delete=models.DO_NOTHING, db_constraint=False, verbose_name='作者')
author = models.ManyToManyField(Author, verbose_name='作者')
def __str__(self):
return self.name
class Meta:
verbose_name = '书籍'
verbose_name_plural = verbose_name
ordering = ['id']
db_table = 'eg_book'
前置条件-创建测试文件
import django,os
os.environ.setdefault('DJANGO_SETTINGS_MODULE','earth.settings')
django.setup()
from example import models
新增数据
# 作者表的数据
models.Author.objects.create(name='wxy')
models.Author.objects.create(name='xiyang')
# 书表的数据
models.Book.objects.create(name='自动化1',price=20,count=3)
models.Book.objects.create(name='自动化1',price=20,count=3)
models.Book.objects.create(name='自动化1',price=20,count=3)
查询数据
# 查询作者和书
author1 = models.Author.objects.filter(id=1).first()
author2 = models.Author.objects.filter(id=2).first()
book1 = models.Book.objects.filter(id=1).first()
book2 = models.Book.objects.filter(id=2).first()
book3 = models.Book.objects.filter(id=3).first()
print(author1) # wxy
print(book1) # <QuerySet [<Book: 自动化1>]>
创建多对多关系
# 创建作者和书的多对多关系,一本书有两个作者,一个作者有多本书
book1.author.add(author1)
book1.author.add(author2)
book2.author.add(author1)
book2.author.add(author2)
多对多查询
# 多对多查询--正向查询,根据书去查作者
z = book1.author.all()
print(z)
# 多对多查询--反向查询,根据作者去查书
f = author1.book_set.all()
print(f)
解除多对多关系
# 解除多对多的关系(解除谁就传入谁)
book1.author.remove(author1)
# 清除关系 将作者2的书全部删掉
book2.author.clear()