112 votes

Utilisation d'un UUID comme clé primaire dans les modèles Django (impact des relations génériques)

Pour un certain nombre de raisons^, je voudrais utiliser un UUID comme clé primaire dans certains de mes modèles Django. Si je le fais, vais-je encore être en mesure de les utiliser en dehors des applications comme "contrib.commentaires", "django droit de vote" ou "django-marquage" qui utilise des relations générique via ContentType?

À l'aide de "django droit de vote", comme un exemple, le droit de Vote modèle ressemble à ceci:

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)

Cette application semble être en supposant que la clé primaire pour le modèle d'être voté est un entier.

Intégré dans les commentaires de l'app semble être capable de traiter les non-entier PKs, si:

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")

Est-ce que "entier-PK-supposé" problème une situation courante pour les applications tierces, ce qui ferait de l'aide Uuid une douleur? Ou, éventuellement, suis-je une erreur de lecture de cette situation?

Est-il possible d'utiliser les Uuid comme clés primaires dans Django sans causer trop de problèmes?


^ Quelques raisons: le masquage de l'objet compte, la prévention de l'url d'un id d'analyse", l'utilisation de plusieurs serveurs pour créer des objets en conflit, ...

69voto

Piet Delport Points 4649

Un UUID de la clé primaire de causer des problèmes non seulement avec les relations générique, mais avec l'efficacité en général: chaque clé étrangère sera nettement plus cher-à la fois de stocker, et de les rejoindre sur une machine parole.

Cependant, rien n'exige que l'UUID à la clé primaire: il suffit de faire un secondaire clé, en complétant votre modèle avec un uuid champ avec unique=True. Utiliser l'implicite de la clé primaire comme d'habitude (à l'intérieur de votre système), et d'utiliser l'UUID que votre identifiant externe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X