これは、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__ をオーバーライドすることだと思います。それは可能ですか、それとも概念的に間違っていますか (またはその両方)? ありがとう!