前面我们成功的用Django连接上了自己的数据库,并通过自带的表管理工具Adimn对数据表进行了简单的管理操作,使我们可以对数据表做出增删改查操作,本次我们通过Django代码的方式来实现数据库的增删改查操作
1.创建数据表
前面我们注意到在已有的数据表中我们对其进行迁移命令,即可在自己的model里生成相应的表及其内容,容易想到反操作是不是即可创建一张新的表单呢 。
事实也是如此,我们在models了写入自己要创建的表 ,表里的字段之类的东西
class Hook(models.Model):
id = models.AutoField(primary_key=True) # id 会自动创建,可以手动写入
title = models.CharField(max_length=32) # 书籍名称
price = models.DecimalField(max_digits=5, decimal_places=2) # 书籍价格
publish = models.CharField(max_length=32) # 出版社名称
pub_date = models.DateField() # 出版时间
class Meta:
managed = True
db_table = 'hook'
这里注意到managed设置为了True前面我们从数据库迁移过来时表都是已经存在的所以managed默认了False这里注意,一开始写成了False则在model里均已生成了表但是却没有同步到数据库中,实际上有关managed他的默认值应为Ture,如果设置为 False ,Django 将不会为当前 model 创建或者删除数据库表,如果你的测试中包含非托管 model (managed=False),那么在测试之前,你应该要确保在测试 创建时已经创建了正确的数据表。
完成自己表的创建后对数据做一下迁移同步到到数据库中去
python manage.py makemigrations xxx(app名) # 运行生成迁移文件的命令
python manage.py migrate xxx # 同步数据库
到这里我们成功的在我们的数据库中创建一张名为hook的新表。
2.现在我们在新建的表里添加一条记录
我们在之前的test里新建一个添加字段的函数如下
def add_book(request):
books = Hook.objects.create(title="如来神掌", price=200, publish="功夫出版社", pub_date="2010-10-10")
print(books) # Book object (18)
return HttpResponse("<p>数据添加成功!</p>")
在url里添加上自己的函数
path('add-book/',testdb.add_book),
3,接下编写查找函数
def serach_book(request):
books = Hook.objects.all()
print(books,type(books)) # QuerySet类型,类似于list,访问 url 时数据显示在命令行窗口中。
return HttpResponse("<p>查找成功!</p>")
#可直接运用前面的user_info作为查找函数,用all()返回表所有的字段,values() 可返回字段的值
也可利用filter函数编辑子查询实现精确查询
books=Hook.objects.filter(title__startswith="如来").annotate(c=Count("title")).values("title", "c")#查找title以如来开头的字段
还有很多函数可以实现sql语句里的各种条件查询,具体想要实现某功能可以在查阅资料
4改
这里介绍两个更改数据的方式
方式一
模型类的对象.属性 = 更改的属性值 模型类的对象.save()
def serach_book(request):
#books = Hook.objects.all()
books=Hook.objects.filter(title="如来神掌").first()
books.price = 400
books.save()
print(books,type(books)) # QuerySet类型,类似于list,访问 url 时数据显示在命令行窗口中。
return HttpResponse(books)
方式二
QuerySet 类型数据.update(字段名=更改的数据)(推荐)
返回值:整数,受影响的行数
def serach_book(request):
#books = Hook.objects.all()
'''
books=Hook.objects.filter(title="如来神掌").first()#查找title为如来神掌的字段将字段的价格更新为400
books.price = 400
books.save()
'''
books = Hook.objects.filter(pk__in=[3, 4]).update(price=888)#查找id为3,4的字段更新为888
print(books,type(books)) # QuerySet类型,类似于list,访问 url 时数据显示在命令行窗口中。
return HttpResponse(books)
5.删
方式一:使用模型类的 对象.delete()。
返回值:元组,第一个元素为受影响的行数。
books=Hook.objects.filter(pk=8).first().delete()
方式二:使用 QuerySet 类型数据.delete()(推荐)
返回值:元组,第一个元素为受影响的行数。
books=Hook.objects.filter(pk__in=[1,2]).delete()
注意:
- a. Django 删除数据时,会模仿 SQL约束 ON DELETE CASCADE 的行为,也就是删除一个对象时也会删除与它相关联的外键对象。
- b. delete() 方法是 QuerySet 数据类型的方法,但并不适用于 Manager 本身。也就是想要删除所有数据,不能不写 all。
books=Hook.objects.delete() # 报错 books=Hook.objects.all().delete() # 删除成功
暂时写到这里