Python 相关对象比较上的奇怪装饰器结果

Python 相关对象比较上的奇怪装饰器结果,python,django,decorator,Python,Django,Decorator,在允许更新/删除对象的视图上,我需要一个decorator来验证要编辑的对象是否属于一个组(模型“loja”)。两者都在url中定义: /[slug model loja--s_loja]/[viewname ex:addmenu]/[object id--obj_id] 因为对象的模型可以变化,所以装饰器将对象的模型作为参数传递。每个可以作为参数传递的模型都有一个名为loja的模型“loja”的外键 装饰师: def acesso_objecto(modelo): def wrap(f

在允许更新/删除对象的视图上,我需要一个decorator来验证要编辑的对象是否属于一个组(模型“loja”)。两者都在url中定义:

/[slug model loja--s_loja]/[viewname ex:addmenu]/[object id--obj_id]

因为对象的模型可以变化,所以装饰器将对象的模型作为参数传递。每个可以作为参数传递的模型都有一个名为loja的模型“loja”的外键

装饰师:

def acesso_objecto(modelo):
    def wrap(f):
        def wrapper(*args, **kwargs):
            s_loja = kwargs['s_loja']
            obj_id = kwargs['obj_id']
            objecto = get_object_or_404(modelo, pk=obj_id)
            loja = get_object_or_404(Loja, slug=s_loja)
            if objecto.loja is not loja:
                raise Http404
            else:
                return f(*args, **kwargs)
        return wrapper
    return wrap
基本上,除非组“loja”和对象存在,并且对象属于该组,否则应该引发404错误


如果没有decorator,视图可以正常工作,但是decorator总是抛出404,因为if语句总是正确的,即使它不应该是正确的。如果我使用loja.id或loja.slug进行验证,它会在它们相关的情况下工作,但是这个函数似乎总是失败,我不知道为什么。

替换
不是
!=


not-loja
的计算结果为
True
,if语句测试的是
objecto.loja
True
之间的相等性。好吧,那太愚蠢了。我认为它与!=不一样,但我不确定loja的计算结果是否为True。这与文档相反。从python文档来看:运算符是和不是对象标识的测试:当且仅当x和y是同一对象时,x为y为真。然后作为脚注:“由于自动垃圾收集、空闲列表和描述符的动态特性,您可能会注意到is运算符的某些用法中似乎存在异常行为,例如涉及实例方法或常量之间的比较。“啊,你说得对,我对
is
操作符的理解是错误的。我应该像你一样引用这些文件。:-)