【问题标题】:custom manager is returning all the objects django.11 postgres自定义管理器正在返回所有对象 django.11 postgres
【发布时间】:2018-08-28 23:13:57
【问题描述】:
class CustomManager(models.Manager):
    def get_query_set(self):
        queryset = super(CustomManager, self).get_query_set()
        return queryset.filter(
            models.Q(expiration_date__gte=datetime.date.today()) |
            models.Q(
                expiration_date__gte=datetime.date.today() - datetime.timedelta(days=40),
                is_invoice_emailed=True
            )
        )

class Subscription(models.Model):
      ....
      objects = CustomManager()
      default = models.Manager()

当我访问Subscription.objects.all() 时,它会返回 db 中的所有记录而不进行过滤。但是,如果我使用下面的查询

queryset = Subscription.objects.all()
queryset.filter(
                models.Q(expiration_date__gte=datetime.date.today()) |
                models.Q(
                    expiration_date__gte=datetime.date.today() - datetime.timedelta(days=40),
                    is_invoice_emailed=True
                )
            )

它正在返回过滤结果。为什么?

我正在使用 django==1.11.11、python2.7 和 db Postgresql

请帮忙。谢谢。

【问题讨论】:

  • 如果第二个经理不是分配给default而是另一个名字会怎样?

标签: django postgresql python-2.7 django-managers


【解决方案1】:

管理器上的 all() 方法只是委托给 get_queryset(),它旨在返回 dB 上的所有对象。 如果你使用 filter() 或 exclude() 之类的过滤器方法,你就已经有了 QuerySet,它会返回某个符合过滤条件的对象。 您可以了解查询集 django queryset documentation here

【讨论】:

    【解决方案2】:

    您的get_query_set() 方法应该像get_queryset() 一样输入

    您也可以直接使用 QuerySet 代替 Manager:

    class CustomQuerySet(models.QuerySet):
    
        def get_result(self):
            return self.filter(
                models.Q(expiration_date__gte=datetime.date.today()) |
                models.Q(
                    expiration_date__gte=datetime.date.today() - datetime.timedelta(days=40),
                    is_invoice_emailed=True
                )
            )
    
    class Subscription(models.Model):
    
        ...
    
        objects = CustomQuerySet().as_manager()
    

    上面的优点是你不再需要提供 Manager 类。

    从现在开始你可以像这样使用它:Subscription.objects.get_result()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-08
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      • 2020-04-28
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多