2010-01-31 16 views
6

Django, modelinize bir SlugField eklerken ayarlayabileceğiniz unique_for_date özelliğine sahiptir.Django'da bir unique_for_field sümüklügü nasıl oluşturulur?

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

Ne ForeignKey gibi olmayan bir DateTime alanı için işlevsellik aynı tür ulaşmanın en iyi yolu olacaktır: Bu sülük yalnızca belirttiğiniz alanın tarihi için benzersiz olmasına neden olur? İdeal olarak, böyle bir şey yapmak istiyorum:

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

aşağıdaki URL'ler yaratabilecek Bu şekilde:

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

Fikirlerim şimdiye kadar:

  • bir ekleme Tabloya sümüklüböcek ve kategori için benzersiz bir dizin. Bu, Django dışında kod gerektirir. Eklenti/güncelleştirme başarısız olduğunda yerleşik yönetici bunu doğru şekilde ele alır mı?

  • Model için kaydetmeyi geçersiz kıl ve yinelenen varsa bir hata atarak kendi onaylamamı ekle. Bunun işe yarayacağını biliyorum, ancak çok da DRY görünmüyor.

  • Tabandan miras alan yeni bir slug alanı oluşturun ve buradaki işlevselliği buraya ekleyin. Bu en iyi yol gibi gözüküyor ama çekirdeğin unique_for_date kodunu inceledim ve bunu genişletmek çok sezgisel görünmüyordu. En iyi yolda

Herhangi bir fikir, öneri veya görüşler bunu yapmak için?

cevap

14

unique_together nedir?

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',) 

Bu bir dizin oluşturur, ancak Django dışında değildir;) Ya noktayı kaçırdım?

+0

Elbette, bu kadar basit. Yardımın ve cevabın güncellenmesi için teşekkürler! –