我一直在反复调用相同的模型,但是不同领域的某些东西,但会有一些总是相同的。我在想是否有办法重构它?
例如。
def x(get_filter, **kwargs):
# if blah
return User.object.get(is_active=True, is_deleted=False, is_staff=False, **kwargs)
# if blah
return User.object.filter(is_active=True, is_deleted=False, is_staff=False, **kwargs)
# if blah
return User.object.get(is_active=True, is_deleted=False, **kwargs)
# if blah
return User.object.get(is_active=True, is_deleted=False, is_staff=False, is_superuser=True, **kwargs)
可以看出,始终使用is_active=True
和is_deleted=False
。
我想做像
is_deleted = {'is_deleted': False}
is_active = {'is_active': True}
User.object.filter( is_staff=False, **is_active, **is_deleted,**kwargs)
在我的IDE中,它会说不允许重复**
有人可以给我一个想法吗?
提前致谢
答案 0 :(得分:2)
当然,试试这个
options = {'is_deleted': False,
'is_active': True}
kwargs.update(options)
User.object.filter(is_staff=False, **kwargs)
答案 1 :(得分:1)
如果你使用的是Python 3,那确实是允许的:
belongs_to :user_to, FPL.Club, foreign_key: :user_to_id
belongs_to :user_from, FPL.Club, foreign_key: :user_from_id
首先让我们记住,>>> def f(*a, **kwargs): pass
...
>>> a = {'a':1}
>>> b = {'b':2}
>>> f(**a, **b) # No problem!
只是一本字典:它没有任何魔力。如果您有默认的kwargs,可以将它们放在另一个(单个!)字典中:
kwargs
现在,我们有两个词典,这是一个简单的组合问题:How to merge two Python dictionaries in a single expression?
我们可以这样做:
additional_kwargs = {'is_deleted': False, 'is_active': True}
然后正常调用该函数:
kwargs.update(additional_kwargs)
答案 2 :(得分:0)
也许您可以根据条件创建一个包含所需值的新词典并传递给过滤器。如果这样的事情解决了你的问题:
should_delete = True if BLAH else False # your condition here
new_kwargs = dict(**kwargs, is_staff=False, is_deleted = should_delete)
return User.object.filter(**new_kwargs)
答案 3 :(得分:0)
您可以使用Python的functool.partial
from functools import partial
def x(get_filter, **kwargs):
common_invocation = partial(User.object.get, is_active=True, is_deleted=False)
# if blah
return common_invocation(is_staff=False, **kwargs)
# if blah
return User.object.filter(is_active=True, is_deleted=False, is_staff=False, **kwargs)
# if blah
return common_invocation(**kwargs)
# if blah
return common_invocation(is_staff=False, is_superuser=True, **kwargs)
我这样离开了你的User.object.filter。你应该从中得到这个想法。