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

来源:互联网 发布:时时彩源码搭建教程 编辑:程序博客网 时间:2024/06/06 06:43

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
原创粉丝点击