Python学习笔记——pycharm web服务器搭建(6):Django模型知识点

本文详细介绍了Django中如何自定义模型管理器以改变默认查询行为,例如过滤逻辑删除的数据。同时,讨论了模型类对象的正确创建方法,通过类方法或模型管理器简化创建过程,提高开发效率。
摘要由CSDN通过智能技术生成

这篇文章用于记录Django模型相关知识,发现有需要补充的会随时添加

仅用于记录,以后方便自己查阅,至于大家能不能看懂,我觉得随缘就行。


1、自定义模型管理器

一般情况下,我们定义的模型类如下

class BookInfo(models.Model):
    btitle = models.CharField(max_length=20)
    bpub_date = models.DateTimeField(db_column='pub_date')
    bread = models.IntegerField(default=0)
    bcomment = models.IntegerField(null=False)
    isDelete = models.BooleanField(default=False)

这时候我们如果要查询,应该如何?

BookInfo.objects.all()

这样没错吧?
查询出BookInfo表中所有数据,以列表形式返回。
起始objects,就是调用ORM的核心——管理器,然后去数据库查询的。

我们可以自定义管理器,就像下面这样:

class BookInfo(models.Model):
    btitle = models.CharField(max_length=20)
    bpub_date = models.DateTimeField(db_column='pub_date')
    bread = models.IntegerField(default=0)
    bcomment = models.IntegerField(null=False)
    isDelete = models.BooleanField(default=False)
    # 自定义管理器
    book1 = models.Manager()

这样我们查询就可以写成这样

BookInfo.book1.all()
# 注意如果自定义了管理器就不能用默认的管理器了
# 也就是说不能够使用
# BookInfo.objects.all()
# 也包括
# BookInfo.objects.get(xxx)

相当于book1就代替了objects的位置。

当然我们如果功能仅限于此,那我们也没有自定义管理器的必要了

我们就是为了更改默认查询,就像下面这样:

# 自定义管理器类
class BookInfoManager(models.Manager):
    # 重写默认查询方法
    def get_queryset(self):
        return super(BookInfoManager, self)
        .get_queryset().filter(isDelete=False)
# 模型类
class BookInfo(models.Model):
    btitle = models.CharField(max_length=20)
    bpub_date = models.DateTimeField(db_column='pub_date')
    bread = models.IntegerField(default=0)
    bcomment = models.IntegerField(null=False)
    isDelete = models.BooleanField(default=False)

    # 新建对应模型的自定义管理器对象
    book = BookInfoManager()
    # 新建默认模型管理类对象
    bookdefault = models.Manager()
    # 一般自定义管理器对象建立后也有一个默认的,来弥补自定义管理器对象的短板

使用的时候就可以自动过滤掉那些已经被逻辑删除的那些内容。
这才是使用模型管理类的正确姿势。


2、模型类对象的正确创建方法

如果模型类是:

class BookInfo(models.Model):
    btitle = models.CharField(max_length=20)
    bpub_date = models.DateTimeField(db_column='pub_date')
    bread = models.IntegerField(default=0)
    bcomment = models.IntegerField(null=False)
    isDelete = models.BooleanField(default=False)

我们在创建的时候该这么做:

b = BookInfo()
b.btitle = 'abc'
b.bpub_date = datetime(1991,1,1)
b.bread = 0
b.bcomment = 0
b.isDelete = False
b.save()

我们创建对象的时候后三个一直都是一样的,那我们每次都写,累不累?

于是我们想利用init方法来新建对象。发现models.Model中已经有了而且做了大量的工作,我们也不知道参数是什么,所以最好用init方法。

(1)那我们直接在类中定义类方法吧。

class BookInfo(models.Model):
    btitle = models.CharField(max_length=20)
    bpub_date = models.DateTimeField(db_column='pub_date')
    bread = models.IntegerField(default=0)
    bcomment = models.IntegerField(null=False)
    isDelete = models.BooleanField(default=False)

    @classmothed
    def create(cls,title,pub):
        b = BookInfo()
        b.btitle = title
        b.bpub_date = pub
        b.bread = 0
        b.bcomment = 0
        b.isDelete = False
        return b

调用:

b = BookInfo.create('abc',datetime(1991,1,1))

(2)之前说过模型类管理器,既然是管理器,就可以去管理模型类的创建

# 自定义管理器类
class BookInfoManager(models.Manager):
    # 重写默认查询方法
    def get_queryset(self):
        return super(BookInfoManager, self)
        .get_queryset().filter(isDelete=False)
    # 创建
    def create(self,title,pub):
        b = BookInfo()
        b.btitle = title
        b.bpub_date = pub
        b.bread = 0
        b.bcomment = 0
        b.isDelete = False
        return b




class BookInfo(models.Model):
    btitle = models.CharField(max_length=20)
    bpub_date = models.DateTimeField(db_column='pub_date')
    bread = models.IntegerField(default=0)
    bcomment = models.IntegerField(null=False)
    isDelete = models.BooleanField(default=False)

    book = BookInfoManager()

创建过程:

b = BookInfo.book.create('123',datetime(1991,1,1))

这样以来可以省去不少麻烦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值