Django对数据表的ddl操作

前面我们成功的用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()   # 删除成功

暂时写到这里

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值