这是我在 stackoverflow 上的第一篇文章,因此欢迎对我提出问题的方式提出任何批评。
在我的代码中,我收到此错误:
RuntimeError: maximum recursion depth exceeded
这是代码(内容无关紧要,我只是以最简单的方式重新创建了错误)。基本上我正在尝试覆盖 __init__。如果对象在数据库中,我想做一些事情,如果不是,我想做一些事情。
class Question(models.Model):
text = models.CharField(max_length=140)
asked = models.BooleanField(default=False)
def __init__(self, text, *args):
#called the __init__ of the superclass.
super(Question, self).__init__()
self, c = Question.objects.get_or_create(text=text)
if c:
print 'This question will be asked!'
self.asked = True
self.save()
else:
print 'This question was already asked'
assert self.asked == True
调用构造函数时出现错误:
Question('how are you?')
我知道问题来自 get_or_create 方法。查看错误消息,
---> 12 self, c = Question.objects.get_or_create(text=text)
...
---> 146 return self.get_query_set().get_or_create(**kwargs)
...
---> 464 obj = self.model(**params)
get_or_create 在某个时候调用对象的构造函数。然后再次调用 get_or_create 等等......
编辑:我想要实现的基本上是能够写:
Question('How are you?')
如果对象在数据库中,则返回对象,如果不在,则返回新创建(并保存)的对象。而不是类似的东西:
> try:
> q = Question.objects.get(text='How are you?')
> except Question.DoesNotExist:
> q = Question(text='How are you?')
> q.save()
所以我想实现这一点的唯一方法是覆盖 __init__。是不可能的还是在概念上是错误的(或两者兼而有之)?谢谢!