使用方法参数按属性过滤查询集

时间:2015-03-22 17:37:16

标签: python django

我想找到一种优雅的方法来创建基于queryset的方法,其结果根据参数而变化。

我有一个MyEvent类,我想要检索所有元素,无论是未取消的元素,还是要取消的元素。 我为此使用了3种不同的方法,但我想简化这一点。我找到了另一种方法,只用一种方法,但我仍然不相信自己这是最干净的方法。你觉得这怎么样?还有更好的主意吗?

@classmethod
def get_events(cls, my_filter=None):

    # Some stuff happens here.

    events = MyEvent.objects.filter(... # some filter here)

    if my_filter is None:
        return events
    elif my_filter == "cancelled":
        return events.filter(is_cancelled=True)
    elif my_filter == "uncancelled":
        return events.filter(is_cancelled=False)
    else:
        raise Exception("Unknown filter value")

我想这里我必须在views.py中调用get_events()方法,所以我可以使用一个管理器,但这也是同样的问题。

1 个答案:

答案 0 :(得分:1)

大多数人都希望在ModelManager中看到这种代码。您不需要这样做,但它会让您的代码对于了解Django的其他人来说更令人惊讶。

要求您指定负数的接口通常会令人困惑。例如。在您的MyEvent对象的管理员中,您将拥有一个带有红色缺陷的is_cancelled列。这往往会让人感到不舒服;-)你可以通过恰当地命名你的参数来补救你的界面:

@classmethod
def get_events(cls, active=None):
    # active should be True or False if specified

    # Some stuff happens here.
    events = cls.objects.filter(... # some filter here)  # note: using cls

    if active is None:
        return events

    return events.filter(is_cancelled=not active)

它使逻辑更短/更简单。