为Django模型编写__init__函数
我正在为我的一个模型写一个 __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")