本文共 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/