私は、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
使用しようとしました (それが関係している場合) ... 同じエラー。