簡體   English   中英

有沒有辦法重構這個? ** kwarg-Django

[英]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=Trueis_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM