Per una serie di ragioni, vorrei utilizzare un UUID come chiave primaria in alcuni dei miei modelli Django. Se lo faccio, potrò comunque utilizzare app esterne come "contrib.comments", "django-voting" o "django-tagging" che usano relazioni generiche tramite ContentType?Utilizzo di un UUID come chiave primaria nei modelli Django (impatto delle relazioni generiche)
Utilizzando "django-voto" come esempio, il modello di voto si presenta così:
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 applicazione sembra essere ipotizzando che la chiave primaria per il modello di essere votato è un numero intero.
La commenti app built-in sembra essere in grado di gestire PKs non interi, però:
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 il problema "integer-PK-assunto" una situazione comune per le applicazioni di terze parti, che avrebbe rendere l'uso di UUID un dolore? O, forse, sto fraintendendo questa situazione?
C'è un modo per utilizzare gli UUID come chiavi primarie in Django senza causare troppi problemi?
^ Alcuni dei motivi: la conta degli oggetti nascosti, impedendo url "id crawling", l'utilizzo di più server per creare oggetti non in conflitto, ...
Inoltre, è possibile ignorare 'save' e generare il vostro UUID lì quando un oggetto viene salvato per la prima volta (verificando se l'oggetto ha una chiave primaria). –
Joe Holloway, non c'è bisogno di questo: si può semplicemente fornire la funzione di generazione UUID come 'predefinita 'del campo. –
Grazie Piet. La tua soluzione è ciò che sto facendo ora e funziona per oscurare la chiave primaria nell'URI (sebbene l'app per i commenti lo mostri ancora in un campo nascosto nel modulo "crea commento").Non mi dà il vantaggio di poter creare facilmente file di database non in collisione su server separati. Oh beh, credo che imparerò a ri-amare la chiave primaria intera. – mitchf