Django中Manager管理器的使用

2 篇文章 0 订阅

Django强大的ORM帮助我们实现了通过类和对象去操作数据库,从而大大简化了我们在后台操作数据库的难度,那么Django是如何实现和数据库之间的映射的呢?
django中ORM有三个类:Manager、Queryset、Model,其中Manager类实现了和数据库之间的操作,Manager类中从QuerySet类中拷贝了许多表级方法,通过这些方法实现数据库的查询,并且将查询到的结果封装成一个Queryset对象返回,然后通过Queryset对象中的表级方法可以获取到我们需要的数据,如果我们不满足于现有的表级方法,可以通过重写Manager实现,一般不会去重写Queryset。而Model类则实现了数据表的创建。
想要自定义Manager的方式实现我们需要的表级方法也很简单,只需要继承Manager类,复写或者新增方法即可。
django中我们都是使用的Manager管理器名称都是objects,如果想要更改某张表的管理器名称也非常简单,只需要在创建表的时候重新定义一个管理器:
在这里插入图片描述
命令行输入python manage.py shell,进行查询:
在这里插入图片描述
可以看到此时使用objects已经查询不到了,因为我们已经更改了管理器的名称,需要使用stores:
在这里插入图片描述
我们已经知道manager管理器在查询完数据库会返回给我们一个可遍历的Queryset对象,ORM允许我们通过重写get_queryset方法去返回我们想要返回的Queryset对象,例如我们在查询商品时只想要返回已上架的商品,正常查询时使用all()方法会将所有商品查询出来:
在这里插入图片描述
这个时候我们需要复写Manager的get_queryset方法:

form django.db import models
class StoreManager(models.Manager):
    def get_queryset(self):
        return super(StoreManager,self).get_queryset().filter(goods_status=1)

然后在Goods表中添加管理器:
在这里插入图片描述
此时在进行查询:
在这里插入图片描述
可以看到返回的只有上架的商品。
ORM中允许一个数据表中可以存在多个管理器。
我们还可以自定义表级方法,例如我们定义一个查询销量在100以上的商品数量的表级方法:

class StoreManager(models.Manager):
    def sale_count(self):
        import pymysql
        db = pymysql.connect("localhost","root",database="frenshshop",port=9508)
        cursor = db.cursor()
        sql = "SELECT * FROM store_goods WHERE goods_sale > 100"
        result = cursor.execute(sql)
        cursor.close()
        db.close()
        return result

添加管理器:
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值