Errori durante la creazione di relazioni generiche utilizzando i tipi di contenuto (object_pk)
-
06-07-2019 - |
Domanda
Sto lavorando per utilizzare il framework ContentType di django per creare alcune relazioni generiche per i miei modelli; dopo aver visto come gli sviluppatori di django lo fanno su django.contrib.comments.models
ho pensato di imitare il loro approccio / convenzioni:
da django.contrib.comments.models , linea 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")
È preso dalla loro fonte e, ovviamente, la loro fonte funziona per me (ho commenti con object_pk è archiviato bene (numeri interi, in realtà); tuttavia, ricevo un errore durante syncdb
sulla tabella creazione che termina:
_mysql_exceptions.OperationalError: (1170, "BLOB/TEXT column 'object_pk' used in key specification without a key length")
Qualche idea sul perché possano farlo e io no?
Dopo essermi guardato intorno, ho notato che the docs indica effettivamente:
Assegna al tuo modello un campo in grado di memorizzare un valore di chiave primaria dai modelli a cui ti riferirai. (Per la maggior parte dei modelli, ciò significa IntegerField o PositiveIntegerField.)
Questo campo deve essere dello stesso tipo della chiave primaria dei modelli che saranno coinvolti nella relazione generica . Ad esempio, se si utilizza IntegerField, non sarà possibile formare una relazione generica con un modello che utilizza un CharField come chiave primaria.
Ma perché possono farlo e non io?!
Grazie.
PS: ho anche provato a creare un AbstractBaseModel con questi tre campi, rendendolo abstract = True
e usando quello (nel caso in cui avesse qualcosa a che fare con esso) ... stesso errore.
Soluzione
Dopo aver scritto quella domanda molto lunga, ho guardato il mysql e ho capito che l'errore derivava da:
class Meta:
unique_together = (("content_type", "object_pk"),)
Apparentemente, non posso averlo in entrambi i modi. Questo mi lascia strappato. Dovrò aprire una nuova domanda se è meglio lasciare aperte le mie opzioni object_pk
(supponiamo che io usi un campo di testo come chiave primaria?) O meglio per applicare unique_togetherness
...