Ошибки при создании общих отношений с использованием типов контента (object_pk) - PullRequest
1 голос
/ 27 октября 2009

Я работаю над использованием среды ContentType django для создания некоторых общих отношений для моих моделей; посмотрев на то, как разработчики 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: я даже пытался создать AbstractBaseModel с этими тремя полями, сделать его abstract=True и использовать его (в случае, если это как-то связано с ним) ... та же ошибка.

1 Ответ

1 голос
/ 27 октября 2009

После того, как я набрал этот действительно длинный вопрос, я посмотрел на mysql и понял, что ошибка проистекает из:

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

Очевидно, я не могу иметь это в обоих направлениях. Что оставляет меня разорванным. Мне придется открыть новый вопрос о том, лучше ли оставить открытыми мои параметры object_pk (предположим, что я использую текстовое поле в качестве первичного ключа?) Или лучше применить unique_togetherness ...

...