Django模型中的默认过滤器

时间:2013-02-17 19:24:36

标签: python django model

可以在Django模型中设置默认过滤器吗?

类似的东西:

class MyModel(models.Model):
    timestamp = models.DateTimeField(default=datetime.utcnow)
    active = models.BooleanField(default=True)

    class Meta:
        ordering = ['-timestamp']
        filtering = [active=True]

2 个答案:

答案 0 :(得分:22)

您必须覆盖manager

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

class MyModel(models.Model):
    timestamp = models.DateTimeField(default=datetime.utcnow)
    active = models.BooleanField(default=True)

    objects = MyModelManager()

    class Meta:
        ordering = ['-timestamp']
Django 1.6之前

get_queryset get_query_set

答案 1 :(得分:1)

通过向模型添加经理,我能够完成我想要的。我还创建了一个抽象基类,以便更轻松地将其添加到其他模型中,而无需复制相同的代码 - 这是修改后的示例:

class MyActiveManager(models.Manager):
    def get_queryset(self):
        return super(MyModelManager, self).get_queryset().filter(active=True)

class MyInactiveManager(models.Manager):
    def get_queryset(self):
        return super(MyModelManager, self).get_queryset().filter(active=False)

class AbstractModel(models.Model):
    timestamp = models.DateTimeField(default=datetime.utcnow)
    active = models.BooleanField(default=True)

    objects = MyActiveManager()
    objects_inactive = MyInactiveManager()
    objects_all = models.Manager()

    class Meta:
        abstract = True
        ordering = ['-timestamp']

class MyModel(AbstractModel):
    # Define active-enabled model here

现在,我想要拥有“活动”(在本例中为“时间戳”)字段的任何模型都可以从基本模型继承。当我使用 MyModel.objects.all() 时 - 我使用 active=True 获取所有对象 - 如果我已经有很多使用对象管理器的代码,这尤其有用。如果我只想要非活动结果,我使用 MyModel.objects_inactive.all(),如果我想要所有记录而不管 active 的值,我使用 MyModel.objects_all.all()