编写一个在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__函数。 有任何想法吗?

依靠Django的内置function和传递命名参数是最简单的方法。

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

但是,如果你设置保存一些击键,我会build议增加一个静态的便利方法,而不是混乱的初始化。

 # 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") 

Django期望模型的构造函数的签名是(self, *args, **kwargs)或者一些合理的传真。 您将签名更改为完全不兼容的内容已将其打破。

正确的答案是避免覆盖__init__并按照Django文档中的描述编写类方法。

但是这可以像你正在尝试的那样完成,你只需要添加*args, **kwargs__init__接受,并把它们传递给super方法调用。

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

不要使用参数创build模型。 如果你像这样做一个模型:

  User('name','email') 

由于大多数模型需要比初始化更多的东西,所以它变得非常快速地变得不可读。 你可以很容易地结束:

 User('Bert', 'Reynolds', 'me@bertreynolds.com','0123456789','5432106789',....) 

这里的另一个问题是,你不知道“伯特”是第一个还是最后一个名字。 最后两个数字可以很容易地是一个电话号码和一个系统ID。 但是如果没有明确的话,你会更容易混淆起来,或者如果你使用的是标识符混淆顺序。 更重要的是,这样做基于顺序的将会对使用这种方法的其他开发人员施加另一个约束,并且不会记住参数的任意顺序。

你应该更喜欢这样的东西:

 User( first_name='Bert', last_name='Reynolds', email='me@bertreynolds.com', phone='0123456789', system_id='5432106789', ) 

如果这是testing或类似的东西,你可以使用工厂快速创build模型。 工厂男孩的链接可能是有用的: http : //factoryboy.readthedocs.org/en/latest/