为Django模型编写__init__函数

84 投票
4 回答
91901 浏览
提问于 2025-04-15 11:29

我正在为我的一个模型写一个 __init__ 函数,这样我就可以通过以下方式创建一个对象:

p = User('name','email')

在我写这个模型的时候,我有:

def __init__(self, name, email, house_id, password):
    models.Model.__init__(self)
    self.name = name
    self.email = email

这个方法是有效的,我可以把对象保存到数据库里,但是当我执行 User.objects.all() 时,它什么都不显示,除非我把我的 __init__ 函数去掉。有没有什么想法?

4 个回答

26

正确的做法是避免重写 __init__ 方法,而是按照 Django 文档 中的说明,写一个类方法。

不过,你现在的做法也是可以的,只需要在你的 __init__ 方法中添加 *args**kwargs,这样就能接收额外的参数,然后把这些参数传递给父类的方法调用。

def __init__(self, name, email, house_id, password, *args, **kwargs):
        super(models.Model, self).__init__(self, *args, **kwargs)
        self.name = name
        self.email = email
51

Django要求模型的构造函数(也就是创建模型实例时用的那个方法)的格式是(self, *args, **kwargs),或者是类似的格式。如果你把这个格式改得完全不一样了,就会导致它无法正常工作。

118

依靠Django自带的功能,并使用命名参数是最简单的方法。

p = User(name="Fred", email="fred@example.com")

不过,如果你想省点打字,我建议你给这个类添加一个静态的便利方法,而不是去修改初始化器。

# In User class declaration
@classmethod
def create(cls, name, email):
  return cls(name=name, email=email)

# Use it
p = User.create("Fred", "fred@example.com")

撰写回答