我想找到一种优雅的方法来创建基于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()方法,所以我可以使用一个管理器,但这也是同样的问题。
答案 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)
它使逻辑更短/更简单。