visible = models.BooleanField()
owner = models.ForeignKey(User, null=True)
def update_address(**kwargs):
address = Address.objects.get(address=kwargs.get('address'))
try:
address.visible = kwargs.get('visible')
except:
pass
try:
address.owner = kwargs.get('owner')
except:
pass
update_address()
应该不会导致address.visible
或address.owner
发生任何事情。
update_address(owner=None)
应删除已设置的任何现有所有者对象。
令我困惑的是如何判断owner=None
是否已明确设置,因此我知道要删除现有的所有者对象,或者是否在没有设置owner
的情况下调用它我应该保留所有者的原样。
答案 0 :(得分:8)
您可以使用“in”关键字检查密钥是否存在,或者您可以在get(key,default)函数的第二个参数中指定默认参数
if 'visible' in kwargs:
do something
# OR
visible = kwargs.get('visible', False)
更新:
如果你的super()类(即父模型)没有采用可见的param,你可以使用pop(key,default)来提取param,然后再将它传递给super。我认为这对你来说也很有用。
def __init__(self, *args, **kwargs):
visible = kwargs.pop('visible', False)
super().__init__(*args, **kwargs)
答案 1 :(得分:1)
您可以使用in
和keys
:
if 'visible' in kwargs.keys():
...
答案 2 :(得分:0)
如果更方便,您也可以自己制作默认选项;通过创建object
的实例,您可以确保它与其他任何内容不同
no_parm = object() # this object is only used for default parms
def thisfunc( p = no_parm ):
if p is no_parm:
# default was used
def thatfunc(**kwargs):
rateval = kwargs.get('rate', no_parm)
if rateval is not no_parm:
# it could be None, if the functiion wa called
# as thatfunc( rate=None)
#
...
注意使用is
进行比较 - 这是可能的 - 并且建议 - 因为我们检查是否有两个对完全相同对象的引用 - 而不是==
的值相等。