2012-10-03 6 views
7

私はレガシーデータベースを使ってRailsからDjangoにプロジェクトを移植しています。 Railsでは、データベース内のどの行にも脚注を追加することができる多相関連がありました。私はDjangoアプリケーションで同じことを実装しようとしています。私はGeneric Relationsの文書を見つけたので、完璧に見えます。残念ながら、関連するモデルのContentType IDを保持するためには、まずレガシーデータベースに新しいフィールドを作成する必要があります。私は2つのテーブルと多相関連を使用していたので、必要なのはDjangoアプリケーションの2つの対応するIDですが、DjangoでContentType IDを検索する適切なコマンドが見つからないようです。一般的な関係のためにDjangoのContentType IDを取得する

ご提案は大歓迎です。私は以前の質問を検索したが、私が探しているものを見つけることができなかった。お時間をいただきありがとうございます。

あなたが行うことができます https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#django.contrib.contenttypes.generic.GenericForeignKey

から

答えて

11

>>> b = Bookmark.objects.get(url='https://www.djangoproject.com/') 
>>> bookmark_type = ContentType.objects.get_for_model(b) 
>>> TaggedItem.objects.filter(content_type__pk=bookmark_type.id, 
...       object_id=b.id) 

ので、ちょうど私はあまりにも、ちょうどモデル名を渡す方法があると思うあなたのモデルのインスタンスをインスタンス化してからContentType.objects.get_for_model(<instance>).id

を行います...それがうまくいくかどうか私に教えてください。私はそれを見つけようとします。私は過去にそれを使ってきました。

+0

ありがとう!私が前に必要としていた答えを得ているように見えますが、私はただそれを認識しませんでした。 ContentType IDは通常文字列ですか?それぞれの数字の後には、Assignmentの "43L"が "44L"であるLetterの "L" - content_type_idが続きます。 –

+0

だから私はまだ 'L'で何が起きているのか分かりませんが、まず最初にやっていたはずのことをして、テーブルを見るために基になるデータベースに行きました。確かに、私が得た数字は正しいが、Lはどこにも見つからない。奇妙な。しかし、多くの、多くのありがとう! –

+0

Lは非常に厄介なDjangoのことです。idの型はdbの "long int"なので、状況によってはLが付いたものが出てきます。それをint( 'int(44L)')にキャストすると44になるはずです。 – Colleen

3

インスタンスを作成せずにContentType IDを取得することもできます。インスタンスを作成する必要がなく、モデル名でContentType IDを取得したい場合は、より効率的です。

ContentType.objects.get(model='bookmark').id

注:お使いのモデルの名前が大文字であれば、検索する下部ケースを使用してください。例:model = 'Bookmark'ではなく 'bookmark'

関連する問題