2013-02-13 3 views
12

Je dois implémenter UUID comme clé primaire, mais je ne suis pas sûr de savoir comment le faire dans Django.Implémentation d'UUID en tant que clé primaire

Mon code

class LinkRenewAd(models.Model): # This model will generate the uuid for the ad renew link 
    def make_uuid(self): 
     return str(uuid.uuid1().int>>64) 

    uuid = models.CharField(max_length=36, primary_key=True, default=make_uuid, editable=False) 
    main = models.ForeignKey(Main) 
    expiration_date = models.DateTimeField() 
    date_inserted = models.DateTimeField(auto_now_add=True) 
    date_last_update = models.DateTimeField(auto_now=True) 

Lorsque je tente de générer ce nouveau modèle sur Sud Je suis l'erreur:

TypeError: make_uuid() takes exactly 1 argument (0 given) 

Répondre

-1

Vous passez la fonction autour, qui sera appelé quelque part dans models.Charfield, à la place d'un objet de LinkRenewAd, aucune instance d'aucun objet (self) n'est transmise à cette méthode, qui en attend une. Donc, faites-en plutôt static function, ou une fonction lambda, ou définissez-la comme un non-membre de la classe.

8

self signifie que vous devez transmettre une instance. Dans votre cas, vous n'avez pas d'instance, ce qui explique pourquoi vous voyez l'erreur étrange d'un argument manquant.

Pour résoudre votre problème, déplacez la méthode qui génère le champ de votre classe de modèle:

def make_uuid(): 
    return str(uuid.uuid1().int>>64) 

class Foo(models.Model): 
    id = models.CharField(max_length=36, primary_key=True, default=make_uuid) 

Cependant, ce n'est pas la solution idéale. Il est préférable de créer un champ de base de données personnalisé. Comme c'est un problème commun, il existe de nombreuses versions. Personnellement, j'aime david cramer's version.

+0

+1: Merci pour le lien vers la version dcramer. –

10

Django 1.8 est livré avec un intégré UUID field

Exemple:

import uuid 
from django.db import models 

class MyUUIDModel(models.Model): 
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 
Questions connexes