18

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

就像是:

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

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

2 回答 2

39

您必须覆盖经理

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']

get_querysetget_query_setDjango 1.6 之前

于 2013-02-17T19:30:34.590 回答
2

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

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()

于 2021-01-05T15:56:05.713 回答