Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么添加这个uuu init_uuuu()方法会破坏我的Django模型?_Python_Django_Constructor - Fatal编程技术网

Python 为什么添加这个uuu init_uuuu()方法会破坏我的Django模型?

Python 为什么添加这个uuu init_uuuu()方法会破坏我的Django模型?,python,django,constructor,Python,Django,Constructor,这个问题是我先前提出的问题的后续问题 我有一个Django模型,如下所示: class MyModel(models.Model): my_field1 = models.DateTimeField(default=datetime.utcnow, editable=False) my_field2 = models.DateTimeField() 它的工作原理是: >>> MyModel.objects.all() [<MyModel: MyModel

这个问题是我先前提出的问题的后续问题

我有一个Django模型,如下所示:

class MyModel(models.Model):
    my_field1 = models.DateTimeField(default=datetime.utcnow, editable=False)
    my_field2 = models.DateTimeField()
它的工作原理是:

>>> MyModel.objects.all()
[<MyModel: MyModel object>, <MyModel: MyModel object>,
这打破了课堂秩序:

>>> MyModel.objects.all()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "MYvirtualenv/lib/python2.7/site-packages/django/db/models/query.py", line 138, in __repr__
    data = list(self[:REPR_OUTPUT_SIZE + 1])
  File "MYvirtualenv/lib/python2.7/site-packages/django/db/models/query.py", line 162, in __iter__
    self._fetch_all()
  File "MYvirtualenv/lib/python2.7/site-packages/django/db/models/query.py", line 965, in _fetch_all
    self._result_cache = list(self.iterator())
  File "MYvirtualenv/src/django-cache-machine-master/caching/base.py", line 118, in __iter__
    obj = iterator.next()
  File "MYvirtualenv/lib/python2.7/site-packages/django/db/models/query.py", line 255, in iterator
    obj = model_cls.from_db(db, init_list, row[model_fields_start:model_fields_end])
  File "MYvirtualenv/lib/python2.7/site-packages/django/db/models/base.py", line 489, in from_db
    new = cls(*values)
TypeError: __init__() takes exactly 1 argument (2 given)
>MyModel.objects.all()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“MYvirtualenv/lib/python2.7/site packages/django/db/models/query.py”,第138行,在__
数据=列表(自身[:报告输出大小+1])
文件“MYvirtualenv/lib/python2.7/site packages/django/db/models/query.py”,第162行,在__
self._fetch_all()
文件“MYvirtualenv/lib/python2.7/site packages/django/db/models/query.py”,第965行,在_fetch_all中
self.\u result\u cache=list(self.iterator())
文件“MYvirtualenv/src/django cache machine master/caching/base.py”,第118行,在__
obj=iterator.next()
迭代器中的第255行文件“MYvirtualenv/lib/python2.7/site packages/django/db/models/query.py”
obj=模型从数据库(数据库,初始列表,行[模型字段开始:模型字段结束])
文件“MYvirtualenv/lib/python2.7/site packages/django/db/models/base.py”,第489行,from_db
新=cls(*值)
TypeError:\uuuu init\uuuuuu()正好接受1个参数(给定2个)

为什么在我添加相对简单的构造函数时会发生这种情况?我该怎么补救呢?我需要该构造函数中的逻辑,所以我不能仅仅消除它。

在Django模型中不需要使用
\uuuu init\uuuu
,而是使用
Meta

class MyModel(models.Model):
    my_field1 = models.DateTimeField(default=datetime.utcnow, editable=False)
    my_field2 = models.DateTimeField()

    class Meta:
        verbose_name = 'My Model'
        verbose_name_plural = 'My Models' # and so on

不鼓励使用init。 根据Django文件:


尽管强烈建议您在文档中使用
classmethod
或自定义管理器,但由于您修改了
超类
的调用签名,您的代码将无法工作,这应该是:

super(MyModel, self).__init__(*args, **kwargs)
您可以通过使用
classmethod
避免这样做:

class MyModel(models.Model):
    my_field1 = models.DateTimeField(default=datetime.utcnow, editable=False)
    my_field2 = models.DateTimeField()

    @classmethod
    def sync_dates(cls, myfield1):
         my_model = cls(my_field1=myfield1, my_field2=myfield1)
         # do something with my_model
         return my_model
MyModel.sync\u日期(某个日期)
起到了作用

或者您可以使用自定义管理器,这是首选方式:

class MyModelManager(models.Manager):
    def create_with_sync_date(self, myfield1):
        my_model = self.create(my_field1=myfield1, my_field2=myfield1)
        # do something with my_model
        return my_model

class MyModel(models.Model):
    my_field1 = models.DateTimeField(default=datetime.utcnow, editable=False)
    my_field2 = models.DateTimeField()

    objects_synced = MyModelManager()

您可以调用
MyModel.objects\u synched.create\u with\u sync\u date(某个日期)

您在构造函数中除了预测之外,到处都有
MyModel
。你是忘了清理它,还是你真的是无意中调用了错误的类?听起来你好像错过了args。def(self,*args,**kwargs)@Anonymous。对那是一个卫生错误。很抱歉现在已修复。有关类似的讨论,请参阅。不要使用init。我已为您的另一个问题添加了一个答案。这无法实现与我显示的
\uuuuuu init\uuu()方法相同的功能。
class MyModel(models.Model):
    my_field1 = models.DateTimeField(default=datetime.utcnow, editable=False)
    my_field2 = models.DateTimeField()

    @classmethod
    def sync_dates(cls, myfield1):
         my_model = cls(my_field1=myfield1, my_field2=myfield1)
         # do something with my_model
         return my_model
class MyModelManager(models.Manager):
    def create_with_sync_date(self, myfield1):
        my_model = self.create(my_field1=myfield1, my_field2=myfield1)
        # do something with my_model
        return my_model

class MyModel(models.Model):
    my_field1 = models.DateTimeField(default=datetime.utcnow, editable=False)
    my_field2 = models.DateTimeField()

    objects_synced = MyModelManager()