gpt4 book ai didi

python - 为什么添加这个 __init__() 方法会破坏我的 Django 模型?

转载 作者:行者123 更新时间:2023-12-01 03:54:07 25 4
gpt4 key购买 nike

这个问题是我之前提出的问题的后续问题 here .

我有一个 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:

def __init__(self, **kwargs):
super(MyModel, self).__init__(**kwargs)
if self.my_field2 is None:
self.my_field2 = self.my_field1

这打破了类(Class):

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

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

最佳答案

尽管强烈建议您在文档中使用类方法或自定义管理器,但您的代码将无法工作,因为您修改了父类(super class)的调用签名>,应该是:

super(MyModel, self).__init__(*args, **kwargs)

您可以通过使用类方法来避免这样做:

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_dates(some_date) 就可以了。

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

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_synced.create_with_sync_date(some_date)

关于python - 为什么添加这个 __init__() 方法会破坏我的 Django 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37802041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com