在Python / Django模型中定义后添加类方法

时间:2014-06-04 08:13:03

标签: python django django-models

我正在使用Django,我通过以下方式导入用户模型:

from django.contrib.auth.models import User, Group, Permission

但现在我想在User模型类中添加一些类方法。

所以这是我的一般问题:我们可以在定义类之后添加类方法吗?

例如:

class A:
    value = 123

def myfunc(self):
    return self.value

我希望myfunc成为A类的成员函数,它怎么样? Plz帮助。

3 个答案:

答案 0 :(得分:0)

您可以通过分配添加类方法,如user2357112建议的那样。

class A(object):
    value = 123

def myfunc(cls):
    return cls.value

A.myfunc = classmethod(myfunc)

print A.myfunc()
> 123

对于Django模型,您可能希望使用自定义Manager来处理所有用户的功能,而不是类方法。但如果没有进一步的信息,我就不能说更多。

答案 1 :(得分:0)

因为你在谈论Django User模型,you should create your own model, extending the User。要做到这一点, 你只需要创建一个与OneToOne模型User关系的模型: ,您应该通过扩展AbstractUser

来创建新的用户模型
from django.contrib.auth.models import AbstractUser

class MyUserModel(AbstractUser):
    # AbstractUser has already every fields needed: username, password, is_active...
    def myfunc(self):
        # Just a dummy working example
        return "My Username in uppercase: %s" % self.username.upper()

AUTH_USER_MODEL = "yourapp.MyUserModel"放入settings.py

然后,您可以像使用User一样使用此新用户模型:它的方法与User相同(例如create_usercheck_password ... ),您可以使用myfunc访问user.myfunc(),其中user是常规MyUserModel实例(来自request.user或ORM)。这与框架组织更加一致,并允许您根据需要向User添加更多字段。


旁注:正如@Daniel Roseman在评论中指出的那样,你应该really extend the AbstractUser model now(自Django 1.6开始)而不是制作UserProfile&#34;代理&#34;。< / p>

相关问题:

答案 2 :(得分:0)

配置文件很好,它会工作,没有问题。 Django ORM中实际意味着的一个选项是代理模型。在代理模型中,您可以拥有父模型的所有字段,并添加自定义方法或管理器,而无需更改父模型。

from django.contrib.auth.models import User

class MyUser(User):
    class Meta:
        proxy = True


    def my_method(self):
        return self.name