2010-07-07 4 views
2

J'ai un modèle Django qui ressemble à ceci:code contrainte unique basé Django modèle

class Categories(models.Model): 
    """ 
    Model for storing the categories 
    """ 
    name = models.CharField(max_length=8) 
    keywords = models.TextField() 
    spamwords = models.TextField() 
    translations = models.TextField() 

def save(self, force_insert=False, force_update=False): 
    """ 
    Custom save method that converts the name to uppercase 
    """ 
    self.name = self.name.upper() 
    super(Categories, self).save(force_insert, force_update) 

Chaque fois que les données sont insérées ou mises à jour. Je voudrais vérifier qu'un enregistrement avec le même nom n'existe pas. C'est une contrainte unique que j'aimerais implémenter via le code et non la base de données. La quantité de données dans cette table est minuscule, donc le coup de performance n'est pas un problème. S'il y a une violation de contrainte, j'aimerais lever l'une des exceptions de contraintes intégrées de Django au lieu de créer une exception personnalisée.

Quelqu'un pourrait-il comment moi le meilleur/moyen le plus rapide pour accomplir cela?

Merci.

Répondre

0

dans la vue

try: 
    Category.objects.get(name='name') 
except Category.DoesNotExist: 
    # call the save method of model 
+0

Où est-ce que j'écrirais ceci? Serait-ce dans la méthode 'save' du modèle ou dans la méthode' clean_name'? –

+0

dans la vue, qui gère la demande – Ashok

4

Dans votre définition du modèle you can tell Django that 'name' should be unique:

name = models.CharField(max_length=8, unique=True) 

Un django.db.IntegrityError ressusciteront si vous tentez d'enregistrer deux enregistrements avec le même nom.

+0

de l'OP, "Je voudrais mettre en œuvre via le code et non le DB" – Ashok

+0

Hmmmm, OK ... mais votre réponse lit également à partir de la base de données avec .get() - ou est-ce que j'interprète «pas le DB» trop littéralement? :-) – msanders

+0

Juste par curiosité. Existe-t-il une contrainte unique insensible à la casse dans les modèles Django? –