django--關於Managers,django--Managers

來源:互聯網
上載者:User

django--關於Managers,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,現在可以正確顯示了,代碼如下:

<span style="color:#ff0000;">class AllFileManager(models.Manager):    def get_queryset(self):        return super(AllFileManager, self).get_queryset().all()</span>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:    <span style="color:#ff0000;">allFiles = AllFileManager()</span>    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.

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.