【问题标题】:Default filter in Django modelDjango 模型中的默认过滤器
【发布时间】:2013-02-02 05:19:27
【问题描述】:

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

类似:

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

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

【问题讨论】:

    标签: python django model


    【解决方案1】:

    您必须覆盖 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']
    

    get_queryset 在 Django 1.6 之前是 get_query_set

    【讨论】:

    • get_query_set 其实就是get_queryset
    • 我不确定这是如何回答这个问题的,因为它不是可以被覆盖的“默认”过滤器,而是对象的永久子集。
    • 我正在寻找这样的东西。为了处理上述评论中的问题 (BjornW),如果您使用 .filter(active=False) 创建了第二个名为 MyInactiveManager 的管理器,并在模型中添加了 inactive_objects=MyInactiveManager(),该怎么办。那么是否可以使用 MyModel.inactive_objects.all() 来检索所有非活动对象?
    • 试过了 - 但它在 MyModelManager “active=True” 中说它给我的字段一个“未定义”错误...
    【解决方案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-03-19
      • 2021-05-22
      • 2010-10-25
      • 2015-06-10
      • 2017-07-27
      • 2011-04-05
      • 2012-05-11
      • 2011-03-05
      • 1970-01-01
      相关资源
      最近更新 更多