可以在Django模型中设置默认过滤器吗?
类似的东西:
class MyModel(models.Model):
timestamp = models.DateTimeField(default=datetime.utcnow)
active = models.BooleanField(default=True)
class Meta:
ordering = ['-timestamp']
filtering = [active=True]
答案 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()