博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django学习之----model(2)
阅读量:4300 次
发布时间:2019-05-27

本文共 1850 字,大约阅读时间需要 6 分钟。

model第二章主要介绍models中attributes(属性)、methods(方法)和重写model方法。

一、自定义Managers

在第一章介绍了查询数据库

person = Person.objects.all()

细心的同学会注意,我们的Person类中并没有定义objects的方法啊,为什么可以这么用呢?其实这是默认的Managers。今天我们来看看如何自定义Managers

class BookManager(models.Manager):    def all(self, *args, **kwargs):        return self.get_query_set().exclude(status=0).filter(*args, **kwargs)    def filter(self, *args, **kwargs):        return self.get_query_set().exclude(status=0).filter(*args, **kwargs)class Book(TimeStampedModel):    DELETED = 0    PUBLISHED = 1    STATUS_CHOICES = (        (DELETED, u'已删除'),        (PUBLISHED, u'发布'),    )    title = models.CharField(max_length=255)    status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, default=PUBLISHED)    objects = models.Manager()    active_objects = BookManager()

会我们可以这么调用Book

 book = Book.objects.all()  #显示数据所有数据

 book = Book.active_objects.all()  #只显示状态不为0的书籍,就是未删除书籍

是不是很方便呢?

二、models添加方法

对于models一些常用的操作,比如将数据库中某一个或者多个字段拼接成一个uri。

class BookPosition(models.Model):    title = models.CharField(max_length=100)    channel = models.CharField()    position = models.PositiveIntegerField(default=0)    description = models.TextField(null=True)    def get_uri(self):        return "/%s/%s/" % (self.channel, self.position)
你就可以这么用:

position = BookPosition.objects.get(title='test')

uri = position.get_uri()

三、重写models的方法

class BookShareData(TimeStampedModel):    book = models.ForeignKey(LayoutBook, related_name='booksharedata')    def save(self, *args, **kwargs):        #do_something() 保存前做一些操作        if user.type == 'VIP':            super(BookShareData, self).save(*args, **kwargs) # Call the "real" save() method.        else:            return        #do_something_else() 保存后做一些操作        user.num += 1

上面我们重写了models的save()方法,再保存前我添加了判断,只有为VIP的用户才有保存的权限。保存后该用户的次数加上1。

第二章就这些内容了,举的例子比较简单,用好以上3种方法,对models的理解绝对上了一个层次。

转载地址:http://lavws.baihongyu.com/

你可能感兴趣的文章
Python日志logging的levelname格式化参数1.1s小记
查看>>
ubuntu虚拟机VMware桥接模式无法自动化获取IP的解决方法
查看>>
Python debug 报错:SystemError: unknown opcode
查看>>
Python将树结构转换成字典形式的多级菜单结构,写入json文件
查看>>
关闭linux防火墙让windows宿主机访问ubuntu虚拟机web服务以及docker
查看>>
pycharm 找不到同目录文件,但是终端中正常的小记
查看>>
安装了grpc但是无法导入:ImportError: No module named 'grpc'
查看>>
Python中logging模块的基本用法
查看>>
Python查看第三方库、包的所有可用版本,历史版本
查看>>
一键将Python2代码转成Python3小记,
查看>>
Python要求O(n)复杂度求无序列表中第K的大元素
查看>>
Python 各种进制互相转换的函数
查看>>
python的单例理解、__new__、新式类object以及python2和python3下__new__的区别。
查看>>
Python动态规划以及编辑距离——莱文斯坦距离小记
查看>>
pycharm控制台报错:xmlrpc.client.Fault: Fault 0: 'java.lang.NullPointerException
查看>>
Python打印二叉树的左视图、右视图
查看>>
OpenStack Mitaka Horizon 主题开发
查看>>
OpenStack Mitaka keystone 分页(pagination)实现
查看>>
OpenStack删除Cinder盘失败解决办法
查看>>
Linux cpu 详解
查看>>