コンテンツタイプ(object_pk)を使用した一般的な関係の作成エラー
-
06-07-2019 - |
質問
djangoのContentTypeフレームワークを使用して、モデルの一般的な関係を作成しようとしています。 django.contrib.comments.models
でdjango開発者がそれをどのように行うかを見た後、私は彼らのアプローチ/慣習を真似すると思いました:
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
にして、それを使用します(何か関係がある場合)...同じエラーです。
解決
その非常に長い質問を入力した後、mysqlを見て、エラーが次の原因であることに気付きました。
class Meta:
unique_together = (("content_type", "object_pk"),)
どうやら、私は両方の方法を持つことはできません。それは私を引き裂かれたままにします。 object_pk
オプションを開いたままにする方がよいか(テキストフィールドを主キーとして使用する場合)、または unique_togetherness コード> ...