Django-ORM增删改查

增加

  1. music.objects.create(属性1 = 值1, 属性2 = 值2,…)
    • 成功:返回创建好的实体对象
    • 失败:抛出异常
  2. 创建model实例对象,并调用save进行保存
    obj = Music(属性 = 值,属性=)
    obj.属性 = 值
    obj.save()
    

查询

数据库查询需要使用管理器对象进行
通过mymodel.objects管理器方法电泳查询方法

  • all()方法

    • 用法MyModel.bojects.all()
    • 作用:查询mymodel实体中所有的数据
    • 等同于 select * from table
    • 返回QuerySet容器对象(可以当做一个数组),内部存放mymodel实例
    from bookstore.models import Book
    books = Book.obects.all() # <QuerySet [<Book: Book object (1)>, <Book: Book object (2)>, <Book: Book object (3)>, <Book: Book object (4)>, <Book: Book object (5)>
    ]>
    
    for book in books:
    	print("书名:", book.title, '出版社:', book.pub)
    

    可以在模型类中定义__str__方法,自定义QuerySet中的输出格式
    例如:在Book中定义:

    def __str__(self):
        return '书名:%s,出版社:%s,价格:%s,零售价:%s' % (self.title, self.pub, 
                                              self.price, self.market_price)
    
    >>> al = Book.objects.all()
    >>> al
    <QuerySet [<Book: 书名:python,出版社:清华大学出版社,价格:20.00,零售价:25.00>, <Book: 书	名:Django,出版社:清华大学出版社,价格:20.00,零售价:22.00>, <Book: 书名:JQuery,出版社:机械工业出版社,价格:90.00,零售价:85.00>, <Book: 书名:Linux,出版社:机械工业出版社,价格:80.00,零售价:65.00>, <Book: 书名:HTML5,出版社:清华大学出版社,价格:90.00,零售价:105.00>]>
    
  • values(‘列1’,‘列2’,…)

    • 用法:mymodel.objects.values(…)
    • 作用:查询部分列的数据并返回
    • 等同于select 列1,列2 from xxx
    • 返回值:QuerySet
      返回查询结果容器,容器内存字典,每个字典代表一条数据,格式为{‘列1’:值1,‘列2’:值2}
    >>> a2 = Book.objects.values('title','pub')
    >>> a2
    <QuerySet [{'title': 'python', 'pub': '清华大学出版社'}, {'title': 'Django', 'pub': '清华大学出版社'}, {'title': 'JQuery', 'pub': '机械工业出版社'}, {'title': 'Linux', 'pub': '机械工业出版社'}, {'title': 'HTML5', 'pub': '清华大学出版社'}]>
    
    
  • values_list(‘列1’,‘列2’)
    和values一样不过不同的是返回QuerySet中的是元祖不是字典

    >>> a3 = Book.objects.values_list('title','pub')
    >>> a3
    <QuerySet [('python', '清华大学出版社'), ('Django', '清华大学出版社'), ('JQuery', '机械工业出版社'), ('Linux', '机械工业出版社'), ('HTML5', '清华大学出版社')]>
    
  • order_by()

    • 用法:mymodel.objects.order_by(’-列’) #默认升序排序,前面加-是降序排序
    • 作用:与all()不同,它会用SQL语句中的order by 子句对查询结果进行根据某个字段选择性的进行排序
    >>> a4 = Book.objects.order_by('-price')
    >>> a4
    <QuerySet [<Book: 书名:JQuery,出版社:机械工业出版社,价格:90.00,零售价:85.00>, <Book: 书名:HTML5,出版社:清华大学出版社,价格:90.00,零售价:105.00>, <Book: 书名:Linux,出版社:机械工业出版社,价格:80.00,零售价:65.00>, <Book: 书名:python,出版社:清华大学出版社,价格:20.00,零售价:25.00>, <Book: 书名:Django,出版社:清华大学出版社,价格:20.00,零售价:22.00>]>
    >>> a5 = Book.objects.values('title').order_by('-price') # 这些方法都可以用子啊QuerySet对象上,所以可以组合
    >>> a5
    <QuerySet [{'title': 'JQuery'}, {'title': 'HTML5'}, {'title': 'Linux'}, {'title': 'python'}, {'title': 'Django'}]>
    >>> print(a5.query) # 可以查看SQL语句
    SELECT `book`.`title` FROM `book` ORDER BY `book`.`price` DESC
    
  • filter(条件)

    • 用法:mymodel.objects.filter(属性1 = 值1,属性2 = 值2) #多个参数是and查询
    • 作用:返回包含此条件的全部数据集
    • 返回值:QuerySet容器对象,内部存放mymodel实例
  • exclude(条件)

    • 作用:返回不包含此条件的全部数据集
    • 语法:mymodel.objects.exclide(属性1 = 值1,属性2 = 值2) 、
  • get(条件)

    • 语法:mymodel.objects.get(条件)
    • 作用:返回满足条件的唯一一条数据
    • 说明:该方法只能返回一条数据,查询结果不是一条数据(大于,小于都不行)则报错。
查询谓词
  • __exact:等值匹配
    Book.objects.filter(id__exact  = 1) #更多的匹配null
    
    • __contains : 包含指定值模糊查询
    Book.objects.filter(pub__cotains = '清')
    
    • __startswith:以xxx开始和__endswith:以xxx结束
    • __gt 大于 __gte 大于等于 __lt小于 __lte小于等于
    • __in查找数据是否在指定返回内 __in = []后面为数组
    • __range 查找数据是否在指定区间内 age__range = (30,50)

更新

更新单个数据
  1. 查 - 通过get()得到要修改的实体对象
  2. 改 - 通过 对象.属性 的方法修改数据
  3. 保存 - 通过 对象.save() 保存数据
>>> b2 = Book.objects.get(id = 2)
>>> b2.price = 70
>>> b2.market_price = 75
>>> b2.save()
批量数据的更新

直接调用QuerySet的update(属性=值)实现批量修改

# 将清华大学的所有图书价格定为1
>>> books = Book.objects.filter(pub = '清华大学出版社')
>>> books
<QuerySet [<Book: 书名:python,出版社:清华大学出版社,价格:22.00,零售价:25.00>, <Book: 书名:Django,出版社:清华大学出版社,价格:70.00,零售价:75.00>, <Book: 书名:HTML5,出版社:清华大学出版社,价格:90.00,零售价:105.00>]>
>>> books.update(price = 1)
3 # 更新个数
>>> books = Book.objects.filter(pub = '清华大学出版社')
>>> books
<QuerySet [<Book: 书名:python,出版社:清华大学出版社,价格:1.00,零售价:25.00>, <Book: 书名:Django,出版社:清华大学出版社,价格:1.00,零售价:75.00>, <Book: 书名:HTML5,出版社:清华大学出版社,价格:1.00,零售价:105.00>]>

删除

单个数据
  1. 通过get()找到要删除的数据对象
  2. 调用这个数据对象的delect()方法实现删除
批量删
  1. 找到QuerySet数据
  2. 调用delect()删除
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值