Django学习之----model(2)

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的理解绝对上了一个层次。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值