Question

Je travaille pour utiliser la structure ContentType de django afin de créer des relations génériques pour mes modèles; Après avoir regardé comment les développeurs de Django le font à django.contrib.comments.models , je pensais imiter leur approche / conventions:

à partir de django.contrib.comments.models , ligne 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")

Cela provient de leur source et, bien sûr, leur source fonctionne pour moi (j'ai des commentaires avec object_pk stockés correctement (entiers, en fait); cependant, une erreur se produit lors de syncdb sur la table création qui se termine:

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

Des idées pour lesquelles ils peuvent le faire et moi non?

Après avoir regardé autour de moi, j'ai remarqué que les documents indiquer réellement:

  

Attribuez à votre modèle un champ pouvant stocker une valeur de clé primaire à partir des modèles avec lesquels vous allez vous rapporter. (Pour la plupart des modèles, cela signifie un IntegerField ou un PositiveIntegerField.)

     

Ce champ doit être du même type que la clé primaire des modèles qui seront impliqués dans la relation générique . Par exemple, si vous utilisez IntegerField, vous ne pourrez pas former de relation générique avec un modèle qui utilise CharField comme clé primaire.

Mais pourquoi peuvent-ils le faire et pas moi?!

Merci.

PS: j’ai même essayé de créer un AbstractBaseModel avec ces trois champs, ce qui le rendait abstract = True et l’utiliser (s’il y avait quelque chose à voir avec cela) ... même erreur.

Était-ce utile?

La solution

Après avoir tapé cette très longue question, j’ai regardé le mysql et réalisé que l’erreur venait de:

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

Apparemment, je ne peux pas avoir les deux. Ce qui me laisse déchiré. Je vais devoir ouvrir une nouvelle question pour savoir s'il vaut mieux laisser mes options object_pk ouvertes (supposons que j'utilise un champ de texte comme clé primaire?) Ou mieux pour appliquer le code unique_togetherness ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top