1

私は、django の ContentType フレームワークを使用して、モデルの一般的な関係を作成しようとしています。django 開発者がどのようにそれを行うかを見た後、django.contrib.comments.models私は彼らのアプローチ/慣習を模倣すると思いました:

django.contrib.comments.models 、21行目から):

content_type   = models.ForeignKey(ContentType,
        verbose_name='content type',
        related_name="content_type_set_for_%(class)s")
object_pk      = models.TextField('object ID')
content_object = generic.GenericForeignKey(ct_field="content_type", fk_field="object_pk")

それはソースから取得されたものであり、もちろん、ソースは私のために機能します (object_pk が正常に保存されたコメントがあります (実際には整数); ただし、syncdbテーブルの作成中にエラーが発生し、終了します:

_mysql_exceptions.OperationalError: (1170, "BLOB/TEXT column 'object_pk' used in key specification without a key length")

彼らがそれを行うことができ、私ができない理由はありますか?

周りを見回した後、ドキュメントが実際に述べていることに気付きました:

関連するモデルからの主キー値を格納できるフィールドをモデルに与えます。(ほとんどのモデルでは、これは IntegerField または PositiveIntegerField を意味します。)

このフィールドは、ジェネリック リレーションに含まれるモデルの主キーと同じタイプである必要があります。たとえば、IntegerField を使用する場合、CharField を主キーとして使用するモデルとジェネリックな関係を形成することはできません。

しかし、なぜ彼らは私ではなくそれを行うことができるのですか?!

ありがとう。

PS: これらの 3 つのフィールドを使用して AbstractBaseModel を作成し、それを作成してabstract=True使用しようとしました (それが関係している場合) ... 同じエラー。

4

1 に答える 1

1

その非常に長い質問を入力した後、mysql を調べたところ、エラーの原因は次のとおりであることがわかりました。

class Meta:
    unique_together = (("content_type", "object_pk"),)

どうやら、私はそれを両方の方法で持つことはできません。それは私を引き裂いたままにします。オプションを開いたままにしておく方がよいかobject_pk(テキストフィールドを主キーとして使用するとしますか?)、それともunique_togetherness...

于 2009-10-27T00:58:56.850 に答える