2011-05-08 14 views
11

Cuando Django ejecuta .save() en un atributo de clave principal, primero hace un SELECCIONAR para ver si ya existe, luego decide si hacer un INSERT o una ACTUALIZACIÓN. ¿Hay alguna manera de hacer elegantemente lo mismo para un campo clave único pero no primario?Compruebe si existe un valor único antes de crearlo

Básicamente, si el modelo se parece a esto:

class Subject(models.Model): 
    name = models.CharField(max_length=64, unique=True) 

me gustaría hacer lo siguiente sin lanzar un error

>>> s=Subject(name="A new subject") 
>>> s.save() 
>>> s 
<Subject: A subject> 
>>> s=Subject(name="A new subject") 
>>> s.save() 
--- django.db.utils.IntegrityError: column name is not unique 

A la inversa, podría hacer 'nombre' del pk, pero No estaba seguro de una forma elegante de Django para hacer identificadores de autosincorporación únicos que no sean únicos.

Cualquier ayuda es apreciada. ¡Gracias!

Respuesta

22

sólo tiene que utilizar get_or_create.

s, created = Subject.objects.get_or_create(name="A new subject") 
2

Puede reemplazar el método ahorrar en ese modelo y comprobar si el valor que se está tratando de ahorrar ya existe:

class Subject(models.Model): 
    name = models.CharField(max_length=64, unique=True) 

    def save(self, *args, **kwargs): 
     #check if value exists/increment something etc 

     #continue with save, if necessary: 
     super(Subject, self).save(*args, **kwargs) 
+0

Pero [no intente] (https://docs.djangoproject.com/en/dev/topics/db/queries/#retrieving-objects) para usar el administrador de modelos ('self.objects.filter .. .') desde dentro de la instancia modelo. Tendrás que hacer 'Subject.objects.filter ...' – hobs

0

`Si pones única = True en su modelo, cuando se intenta crear un objeto con igual única = True parámetro, se devolvió el error, así que asegúrese de que usted los llama en try-except para capturar las que .

Cuestiones relacionadas