对象方法可以返回对象的实例吗?

时间:2014-05-15 16:07:07

标签: python django

我的团队中的某个人在我们的人员模型上编写了一个方法(一个'用户的扩展名,虽然它不是从用户继承的):

class Person(models.Model):
    @staticmethod
    def from_user(user):
        try:
            return Person.objects.get(username=user.username)
        except ObjectDoesNotExist:
            return None

理论上,Person.from_user(request.user)应该返回正确的Person。相反,我得到了AttributeError: 'NoneType' object has no attribute 'objects'

我是静态方法的新手,所以我可能会遗漏一些东西 - 但在我看来,这是不可能的。在其他方面很容易解决;我只是想知道是否有任何真正的方法让Person方法返回像这样的Person实例,如果我应该修复这个方法或者只是抛弃它。

编辑:如果我跳转到PDB并导入模型,Person.objects.get(username=user.username)按预期工作。无法看到Person被设置为None的方式或位置。

1 个答案:

答案 0 :(得分:3)

您展示的代码不应该抛出错误:它完全有效。

然而,更好的方法是使用classmethod而不是staticmethod。类方法的要点是它自动传递类本身,您可以在方法中使用它:

@classmethod
def from_user(cls, user):
    return cls.objects.get(username=user.username)