[英]is there a way to refactor this? **kwarg - django
我已經一遍又一遍地調用相同的模型,但是有些領域不同,但是會有一些總是一樣的。 我在想是否有一種方法可以重構它?
例如。
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中,它會說不允許重復**
有人可以給我一個主意嗎?
提前致謝
當然,請嘗試這個
options = {'is_deleted': False,
'is_active': True}
kwargs.update(options)
User.object.filter(is_staff=False, **kwargs)
如果您使用的是Python 3,則確實可以這樣做:
>>> def f(*a, **kwargs): pass
...
>>> a = {'a':1}
>>> b = {'b':2}
>>> f(**a, **b) # No problem!
首先,讓我們記住, kwargs
只是一本字典:它沒有魔力。 如果您有默認的kwarg,可以將它們放在另一個(單個!)字典中:
additional_kwargs = {'is_deleted': False, 'is_active': True}
現在,我們有兩個字典,這是將它們組合在一起的一個簡單問題: 如何在一個表達式中合並兩個Python字典?
我們可以做到這一點:
kwargs.update(additional_kwargs)
然后像往常一樣調用該函數:
User.object.filter(is_staff=False, **kwargs)
也許您可以根據條件創建具有所需值的新字典,然后傳遞給過濾器。 塞,如果這樣的事情解決了您的問題:
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)
您可以使用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。 您應該從中得到想法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.