Django Managers

平时manager很少接触,但是我们平时经常在用它。先看下模型:

class Person(models.Model):
    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=20)

当用Person.objects.filter的时候,其中objects就是在用manager,可以自定义它

class PersonManager(models.Manager):
    def full_name(self, pk):
        person = self.filter(pk=pk).get()
        if not person:
            return ''
        return person.first_name + person.last_name
class Person(models.Model):
    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=20)
    objects = PersonManager()

     

In [4]: from myapp import models
In [5]: person = models.Person.objects.full_name(1)
In [6]: person
Out[6]: 'wzzx'

这个操作提示我们在manager里可以包含表级别的代码,这就为我们提供了组织django代码的一种模式。而且manager可以定义多个。

先定义另外一个manager

class PersonAPIManager(models.Manager):
    def fetch_last(self):
        return self.get_queryset().last()

然后在模型中加入

API =PersonAPIManager()

测试下

In [4]: from myapp import models
In [8]: models.Person.API
Out[8]: <myapp.models.PersonAPIManager at 0x10c15e748>
In [9]: models.Person.API.fetch_last().last_name
Out[9]: 'zx'

这篇就这么多了,总结下,其实看似内容不多,但是这个模式对django 代码组织的启发意义非常大的。

Happy hacking

暂无评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

备案号:浙ICP备15006402号-2 备注:博客君在0.053里共执行39个查询, 总共占用内存 6.92MB