django--关于Managers

Default managers

If you use custom Manager objects, take note that the first Manager Django encounters (in the order in which they’re defined in the model) has a special status. Django interprets the first Manager defined in a class as the “default” Manager, and several parts of Django (including dumpdata) will use that Manager exclusively for that model. As a result, it’s a good idea to be careful in your choice of default manager in order to avoid a situation where overriding get_queryset() results in an inability to retrieve objects you’d like to work with.


开始写了两个判断是否私密的manager,然后发现admin里面的显示变成了只能显示私密的File:

class PrivateFileManager(models.Manager):
    def get_queryset(self):
        return super(PrivateFileManager, self).get_queryset().filter(public=True)

class PublicFileManager(models.Manager):
    def get_queryset(self):
        return super(PublicFileManager, self).get_queryset().fileter(public=False)

class File(models.Model):
    file = models.FileField(upload_to='medias')
    public = models.BooleanField(default=True)# has default
    project = models.ForeignKey(Project, related_name="projects")
    tag = models.ManyToManyField(Tag, related_name="tags")
    uploader = models.ForeignKey(User, related_name="users")
    group = models.ManyToManyField(Group, related_name="groups")
    temp_delect = models.BooleanField(default=False)# has default
    desc = models.TextField(blank=True, null=True)
    upload_date = models.DateTimeField(auto_now_add=True)
    change_date = models.DateTimeField(auto_now=True)
    
    # Managers blow:
    privateFiles = PrivateFileManager()
    publicFiles = PublicFileManager()
    
    def __unicode__(self):
        return self.file.name
    class Meta:
        permissions = (
            ("can_edit_file", "能编辑文件"),
            ("can_list_file", "能看文件列表"),
            ("can_delete_file", "能删除文件"),
            ("can_download_file", "能下载文件"),
        )

然后再仔细看了一下文档,发现了文章开头的那段话,大概意思就是定义的第一个manager将会作为默认manager....我果断加了一个ALL,现在可以正确显示了,代码如下:

class AllFileManager(models.Manager):
    def get_queryset(self):
        return super(AllFileManager, self).get_queryset().all()
class PrivateFileManager(models.Manager):
    def get_queryset(self):
        return super(PrivateFileManager, self).get_queryset().filter(public=True)

class PublicFileManager(models.Manager):
    def get_queryset(self):
        return super(PublicFileManager, self).get_queryset().fileter(public=False)

class File(models.Model):
    file = models.FileField(upload_to='medias')
    public = models.BooleanField(default=True)# has default
    project = models.ForeignKey(Project, related_name="projects")
    tag = models.ManyToManyField(Tag, related_name="tags")
    uploader = models.ForeignKey(User, related_name="users")
    group = models.ManyToManyField(Group, related_name="groups")
    temp_delect = models.BooleanField(default=False)# has default
    desc = models.TextField(blank=True, null=True)
    upload_date = models.DateTimeField(auto_now_add=True)
    change_date = models.DateTimeField(auto_now=True)
    
    # Managers blow:
    allFiles = AllFileManager() # <-------------------------------------------------------------
    privateFiles = PrivateFileManager()
    publicFiles = PublicFileManager()
    
    def __unicode__(self):
        return self.file.name
    class Meta:
        permissions = (
            ("can_edit_file", "能编辑文件"),
            ("can_list_file", "能看文件列表"),
            ("can_delete_file", "能删除文件"),
            ("can_download_file", "能下载文件"),
        )

That's all.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值