django--关于Managers

本文探讨了在 Django 模型中使用多个 Manager 对象时遇到的问题,特别是当第一个 Manager 被解释为默认 Manager 时,如何确保数据正确显示。通过引入一个全量查询的 Manager 解决了仅显示特定类型对象的问题。
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.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值