Errores al crear relaciones genéricas utilizando tipos de contenido (object_pk)
-
06-07-2019 - |
Pregunta
Estoy trabajando para usar el marco ContentType de django para crear algunas relaciones genéricas para mis modelos; después de ver cómo lo hacen los desarrolladores de django en django.contrib.comments.models
pensé que imitaría su enfoque / convenciones:
de django.contrib.comments.models , línea 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")
Eso está tomado de su fuente y, por supuesto, su fuente funciona para mí (tengo comentarios con object_pk almacenados muy bien (enteros, en realidad); sin embargo, recibo un error durante syncdb
en la tabla creación que termina:
_mysql_exceptions.OperationalError: (1170, "BLOB/TEXT column 'object_pk' used in key specification without a key length")
¿Alguna idea de por qué pueden hacerlo y yo no?
Después de mirar alrededor, noté que los documentos estado real:
Dele a su modelo un campo que pueda almacenar un valor de clave principal de los modelos con los que se relacionará. (Para la mayoría de los modelos, esto significa un IntegerField o PositiveIntegerField).
Este campo debe ser del mismo tipo que la clave principal de los modelos que estarán involucrados en la relación genérica . Por ejemplo, si usa IntegerField, no podrá formar una relación genérica con un modelo que use un CharField como clave principal.
¡Pero por qué pueden hacerlo ellos y yo no!
Gracias.
PD: Incluso intenté crear un AbstractBaseModel con estos tres campos, convirtiéndolo en abstract = True
y usándolo (en caso de que tuviera algo que ver con eso) ... mismo error.
Solución
Después de escribir esa pregunta realmente larga, miré el mysql y me di cuenta de que el error provenía de:
class Meta:
unique_together = (("content_type", "object_pk"),)
Aparentemente, no puedo tener las dos cosas. Lo que me deja desgarrado. Tendré que abrir una nueva pregunta sobre si es mejor dejar abiertas mis opciones de object_pk
(¿supongo que uso un campo de texto como clave principal?) O mejor para aplicar unique_togetherness ...