2010-02-04 12 views
233

¿Hay alguna manera de definir un par de campos como únicos en Django?Cómo definir dos campos "únicos" como pareja

Tengo una tabla de volúmenes (de diarios) y no quiero más de un número de volumen para el mismo diario.

class Volume(models.Model): 
    id = models.AutoField(primary_key=True) 
    journal_id = models.ForeignKey(Journals, db_column='jid', null=True, verbose_name = "Journal") 
    volume_number = models.CharField('Volume Number', max_length=100) 
    comments = models.TextField('Comments', max_length=4000, blank=True) 

traté de poner unique = True como atributo en los campos journal_id y volume_number pero no funciona.

Respuesta

418

Hay una solución simple para usted llamada unique_together que hace exactamente lo que quiere.

Por ejemplo:

class MyModel(models.Model): 
    field1 = models.CharField(max_length=50) 
    field2 = models.CharField(max_length=50) 

    class Meta: 
    unique_together = ('field1', 'field2',) 

Y en su caso:

class Volume(models.Model): 
    id = models.AutoField(primary_key=True) 
    journal_id = models.ForeignKey(Journals, db_column='jid', null=True, verbose_name = "Journal") 
    volume_number = models.CharField('Volume Number', max_length=100) 
    comments = models.TextField('Comments', max_length=4000, blank=True) 

    class Meta: 
    unique_together = ('journal_id', 'volume_number',) 
+0

¿Cómo puedo comprobar, lo excepción serán arrojados, cuando trato de crear un objeto que rompe este ¿restricción? – gruszczy

+2

Diría que obtendrás una excepción de "ValidationError". Eche un vistazo a los documentos de Django: Model.validate_unique – Jens

+2

¿Cómo manejaría esto decir si volume_number podría ser nulo? Mysql no parecerá hacer cumplir único en ese caso. – Greg

Cuestiones relacionadas