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
添加管理器: