【问题标题】:Updating custom model manager doesn't take effect更新自定义模型管理器不生效
【发布时间】:2014-10-17 05:33:24
【问题描述】:

我有一个 Order 模型和一个名为 OrderManager 的自定义模型管理器,如下所示。

class Order(models.Model):
    # Model fields are declared here.
    ... 
    objects = OrderManager()
    all_objects = models.Manager()

class OrderManager(models.Manager):
    def get_queryset(self):
        return super(OrderManager, self).get_queryset().filter(Q(x='y') | Q(x='y'))

我通过向查询集添加另一个过滤器来更新OrderManager 类,结果证明是新的实现

class OrderManager(models.Manager):
    def get_queryset(self):
        return super(OrderManager, self).get_queryset().filter(~Q(order_status='Cancelled'), Q(x='y') | Q(x='y'))

但是,当我使用更新的管理器从 Order 模型中检索数据时,它会忽略更改并仍然带来 order_status 为“已取消”的对象。

orders = Order.objects.all() # Retrieves cancelled orders as well.

另一方面,显式应用最后一个附加过滤器:

orders = Order.objects.filter(~Q(order_status='Cancelled') # Ignores the cancelled orders.

是迁移问题还是什么?我觉得我在某个地方犯了一个愚蠢的错误(可能与此代码无关),但我只是失明了。任何建议都非常感谢。

ps:我在 Webfaction 上使用 Django 1.5.5。

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    在 django 1.6 之前,方法被命名为 get_query_set,而不是 get_queryset(检查附加下划线)。

    所以在 django 1.5 及更早的版本中需要重写get_query_set 方法:

    class OrderManager(models.Manager):
        def get_query_set(self):
            return super(OrderManager, self).get_query_set().filter(~Q(order_status='Cancelled'), Q(x='y') | Q(x='y'))
    

    【讨论】:

    • 感谢您的收获!我会在我回到我的工作站并将您的答案标记为已接受后立即尝试一下。
    猜你喜欢
    • 1970-01-01
    • 2012-06-04
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 2011-11-13
    相关资源
    最近更新 更多