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.

时间: 2024-10-11 11:51:34

django--关于Managers的相关文章

Django 1.6 最佳实践: 如何正确使用 Signal(转)

原文:http://www.weiguda.com/blog/38/ 如何正确的使用signal: 简单回答是: 在其他方法无法使用的情况下, 才最后考虑使用signal. 因为新的django开发人员得知signal之后, 往往会很高兴去使用它. 他们在能使用signal的地方就使用signal, 并且这是他们觉得自己是django专家一样. 然而, 像这样编码一段时间后, django项目就会变得异常复杂, 许多内容都纠结在一起无法解开. 许多开发者也会将django signal和异步消息

Django之安装与部署

安装(全部为Centos6.7环境下) python单一版本环境安装 (系统已自带python2.6情况下)注意!!由于系统已经自带python2.6,自己又编译安装了python2.7,如果此时直接用yum 安装yum install python-pip 会安装到python2.6上,必须编译安装pip才行,而pip的安装又依赖setuptools,系统自带了0.6的setuptools,我们必须下载另一个setuptools手动安装,用python27 setup.py install 这

Django 实现WEB登陆

实现环境: 1.System version:rh6.5 2.Python version:2.6.6 3.Django version:1.2.7 创建项目: 1.[[email protected] ~]#django-admin.py startproject mysite 2.[[email protected] mysite]#python manage.py startapp app01 3.[[email protected] mysite]#mkdir templates 4.[

Django 实现WEB登陆(第二版)

实现环境: 1.System version:rh6.5 2.Python version:2.6.6 3.Django version:1.2.7 创建项目: 1.[[email protected] ~]#django-admin.py startproject mysite 2.[[email protected] mysite]#python manage.py startapp app01 3.[[email protected] mysite]#mkdir templates 4.[

django 简单的邮件系统

django邮件系统 Django发送邮件官方中文文档 总结如下: 1.首先这份文档看三两遍是不行的,很多东西再看一遍就通顺了. 2.send_mail().send_mass_mail()都是对EmailMessage类使用方式的一个轻度封装,所以要关注底层的EmailMessage. 3.异常处理防止邮件头注入. 4.一定要弄懂Email backends 邮件发送后端 5.多线程的邮件发送. 个人简单配置如下: 首先是settings.py文件 #settings.py #邮件配置 EMA

django book学习笔记——模型高级进阶

1.访问外键(Foreign Key)值 当你获取一个为ForeignKey 字段时,你会得到相关的数据模型对象. 例如: >>> b = Book.objects.get(id=50) >>> b.publisher <Publisher: Apress Publishing> >>> b.publisher.website u'http://www.apress.com/' 对于用 ForeignKey 来定义的关系来说,在关系的另一端

Django中的Model继承

Django 中的 model 继承和 Python 中的类继承非常相似,只不过你要选择具体的实现方式:让父 model 拥有独立的数据库:还是让父 model 只包含基本的公共信息,而这些信息只能由子 model 呈现. Django中有三种继承关系: 1.通常,你只是想用父 model 来保存那些你不想在子 model 中重复录入的信息.父类是不使用的也就是不生成单独的数据表,这种情况下使用抽象基类继承 Abstract base classes. 2.如果你想从现有的Model继承并让每个

Django的日志如何配置?

Django对于日志输出的信息是很完善的,request的信息,setting配置,trackback的信息,一应俱全,足够我们调试了.但是在线上环境,如果让用户看到这些信息,是很不安全的(暴露代码).所以在线上我们要关闭Debug,但是又不能扔掉这些调试信息,这就要用到logging模块. logging模块其实是Python的模块,在Django开发中有很多本地化的支持. 理解Logger 首先要理解logging的工作,这里面主要有四个东西:格式器formatter,过滤器filter,处

django开发总结:

一,关于setting目录中的“DEBUG” DEBUG=False 把DEBUG从True改成False后就会出现404(必需指定404和500错语页面,如上图的目录结构)找不到页面的错误.原因是DEBUG为 True时django会默认帮我们处理静态文件,而为False的话还需要我们做点事.在全局usrs.py中加下如下代码: from django.conf import settings if settings.DEBUG is False: urlpatterns += pattern

django模型models.py文件内容理解

首先,要理解这句话:模型是你的数据的唯一的.权威的信息源.它包含你所存储数据的必要字段和行为.通常,每个模型对应数据库中唯一的一张表 基础:每个模型都是django.db.models.Model的一个python子类 模型的每个属性都表示为数据库中的一个字段 django提供一套自动生成的用于数据库访问的API,下一章总结 1.第一个例子 from django.db import models class Person(models.Model): first_name = models.C