Per una serie di motivi ^, vorrei utilizzare un UUID come chiave primaria in alcuni dei miei modelli Django. Se lo faccio, sarò ancora in grado di utilizzare app esterne come "contrib.comments", "django-voting" o "django-tagging" che utilizzano relazioni generiche tramite ContentType?
Usando "django-voting" come esempio, il modello di voto ha questo aspetto:
class Vote(models.Model):
user = models.ForeignKey(User)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
object = generic.GenericForeignKey('content_type', 'object_id')
vote = models.SmallIntegerField(choices=SCORES)
Questa app sembra presumere che la chiave primaria per il modello su cui si vota sia un numero intero.
L'app per i commenti integrata sembra essere in grado di gestire PK non interi, tuttavia:
class BaseCommentAbstractModel(models.Model):
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")
Questo problema "presunto PK intero" è una situazione comune per app di terze parti che renderebbero difficoltoso l'utilizzo degli UUID? O forse sto interpretando male questa situazione?
C'è un modo per utilizzare gli UUID come chiavi primarie in Django senza causare troppi problemi?
^ Alcuni dei motivi: nascondere il conteggio degli oggetti, impedire l'URL "id crawling", utilizzare più server per creare oggetti non in conflitto, ...
default
.