このデモから一般的に関連するオブジェクトを作成するコードを実行しました: http ://www.djangoproject.com/documentation/models/generic_relations/
すべてが最初は良いです:
>>> bacon.tags.create(tag="fatty")
<TaggedItem: fatty>
>>> tag, newtag = bacon.tags.get_or_create(tag="fatty")
>>> tag
<TaggedItem: fatty>
>>> newtag
False
しかし、私が自分のアプリに興味を持っているユースケースは次のとおりです。
>>> tag, newtag = bacon.tags.get_or_create(tag="wholesome")
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/lib/python2.6/dist-packages/django/db/models/manager.py", line 123, in get_or_create
return self.get_query_set().get_or_create(**kwargs)
File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 343, in get_or_create
raise e
IntegrityError: app_taggeditem.content_type_id may not be NULL
他のコードを見た後、私はたくさんのランダムなことを試しました:
>>> tag, newtag = bacon.tags.get_or_create(tag="wholesome", content_type=TaggedItem)
ValueError: Cannot assign "<class 'generics.app.models.TaggedItem'>": "TaggedItem.content_type" must be a "ContentType" instance.
また:
>>> tag, newtag = bacon.tags.get_or_create(tag="wholesome", content_type=TaggedItem.content_type)
InterfaceError: Error binding parameter 3 - probably unsupported type.
等
誰かが私に正しい構文を教えてくれると確信していますが、ここでの本当の問題は、何が起こっているのかわからないということです。私は10年以上にわたって強く型付けされた言語(x86アセンブリ、C ++およびC#)で開発してきましたが、Pythonは初めてです。このようなことが壊れたときにPythonで何が起こっているのかを追跡するのは本当に難しいと思います。
前に述べた言語では、このようなことを理解するのはかなり簡単です。メソッドのシグネチャとパラメータを確認してください。Djangoのドキュメントを30分見てみると、私は迷子になりました。get_or_create(self、** kwargs)のソースを確認しても、メソッドシグネチャがなく、コードが非常に一般的であるため、役に立ちませんでした。次のステップは、メソッドをデバッグして何が起こっているのかを理解しようとすることですが、これは少し極端に思えます...
私はここでいくつかの基本的な動作原理を見逃しているようです...それは何ですか?将来、このような問題を自分で解決するにはどうすればよいですか?