2010-01-31 22 views
6

Django tiene una propiedad unique_for_date que puede establecer al agregar un SlugField a su modelo. Esto hace que la bala sea único sólo para las fechas del campo especifica:¿Cómo crear una babosa unique_for_field en Django?

class Example(models.Model): 
    title = models.CharField() 
    slug = models.SlugField(unique_for_date='publish') 
    publish = models.DateTimeField() 

¿Cuál sería la mejor manera de lograr el mismo tipo de funcionalidad para un campo no DateTime como un ForeignKey? Idealmente, quiero hacer algo como esto:

class Example(models.Model): 
    title = models.CharField() 
    slug = models.SlugField(unique_for='category') 
    category = models.ForeignKey(Category) 

Esta manera de que pudiera crear las siguientes direcciones:

/example/category-one/slug 
/example/category-two/slug 
/example/category-two/slug <--Rejected as duplicate 

Mis ideas hasta el momento:

  • Añadir una índice único para el slug y categoryid para la tabla. Esto requiere un código fuera de Django. ¿Y el administrador integrado manejaría esto correctamente cuando falla la inserción/actualización?

  • Anule el guardado para el modelo y agregue mi propia validación, lanzando un error si existe un duplicado. Sé que esto funcionará, pero no parece muy SECO.

  • Crea un nuevo campo slug que hereda de la base y agrega allí la funcionalidad unique_for. Esto parece ser la mejor manera, pero miré a través del código unique_for_date del núcleo y no me pareció muy intuitivo extenderlo.

Cualquier ideas, sugerencias u opiniones sobre la mejor manera de hacer esto?

Respuesta

14

¿Qué hay de unique_together?

class Example(models.Model): 
    title = models.CharField() 
    slug = models.SlugField(db_index=False) 
    category = models.ForeignKey(Category) 

    class Meta: 
     unique_together = (('slug','category'),) 
     # or also working since Django 1.0: 
     # unique_together = ('slug','category',) 

Esto crea un índice, pero no está fuera de Django;) O me he perdido el punto?

+0

Por supuesto, es así de simple. Gracias por la ayuda y la actualización de la respuesta! –

Cuestiones relacionadas