django Python的方法来检查一个变量是否作为kwargs传递?

pepwfjgg  于 2023-06-25  发布在  Go
关注(0)|答案(4)|浏览(154)
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.visibleaddress.owner发生任何事情。
update_address(owner=None)应删除设置的所有现有所有者对象。
让我困惑的是,如何判断owner=None是否被显式设置,以便我知道删除现有的所有者对象,或者如果它被调用时没有设置owner,所以我应该保持所有者的原样。

tktrz96b

tktrz96b1#

您可以使用“in”关键字来检查键是否存在,或者您可以在**dict.get(key,default)**函数的第二个参数中指定默认参数

if 'visible' in kwargs:
   do something

# OR

visible = kwargs.get('visible', False)

如果你的super()类(即父模型)不接受可见参数,您可以使用**dict.pop(key,default)**提取参数,然后将其传递给超级模型。

def __init__(self, *args, **kwargs):
   visible = kwargs.pop('visible', False)
   super().__init__(*args, **kwargs)
6l7fqoea

6l7fqoea2#

可以使用inkeys

if 'visible' in kwargs.keys():
    ...
ufj5ltwl

ufj5ltwl3#

如果方便的话,你也可以设置自己的默认选项;通过创建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进行比较-这是可能的-并且推荐-因为我们正在检查是否有两个引用完全相同的对象-而不是像==那样的值相等。

qyswt5oh

qyswt5oh4#

如果你想做点什么如果它通过了,那么

value = kwargs.get('address', None )
if value is not None:
    # it was there, safe to use value in expressions

value = kwargs.get('address', default_value)
# proceed with the passed value or the default value

如果您还想删除它(通常是因为超类不愿意看到它),请以相同的方式使用pop方法代替get。比如说

def __init( self, **kwargs):
     self.foo = kwargs.pop('foo', 0)
     super().__init__( **kwargs )

相关问题