Bir nesnenin benzersiz olduğundan emin olmak ve bir kullanıcı kaydetmeye çalıştığında (örneğin, yönetici aracılığıyla) bir hata atmak istiyorum. Eşsiz olarak, nesnenin bazı özniteliklerinin, diğer nesnelerinkiyle aynı değerleri taşıyabileceğini kastediyorum, ancak TÜM, başka bir nesnenin değerleriyle aynı olamaz. Ben yanılmıyorsamDRY benzersiz nesneleri Django
, ben şöyle yapabilirsiniz:
class Animal(models.Model):
common_name = models.CharField(max_length=150)
latin_name = models.CharField(max_length=150)
class Meta:
unique_together = ("common_name", "latin_name")
Ama sonra her zaman modeli planı ayrı (örneğin yeni bir alan eklemek veya varolan alanın adını değiştirmek için) Ayrıca, unique_together'a atanan parantez içindeki alanların listesini de düzenlemek zorundayım. Basit bir modelle, bu tamam, ama önemli bir ile, refactoring sırasında gerçek bir güçlük olur.
unique_together parantezindeki alan adları listesini yazmayı tekrarlamaktan nasıl kaçınamıyorum? Modelin alanlarının listesini bir değişkene geçirmenin ve bu değişkeni unique_together yerine atamanın bir yolu var mı?
+1 (veya soyut temel sınıf
Model
uzanan ve metaclass geçersiz kılma türetmek) - büyük soru. Yapabileceğini sanmıyorum, ama başkalarının fikirlerini duymakla ilgileniyorum. –+1 - Birisi güzel bir çözüm bulabilirse gerçekten ilginç. Denedim ama bunu yansıtma yoluyla yapamayacağınız için, çünkü Hayvan sınıfındaki özellikleri okuyamazsınız (Hayvanın o anda tam olarak tanımlanmadığı açıktır). – FlorianH
irc: //irc.freenode.net/django üzerinde jtiai soruyu tartışmak için biraz zaman harcadı ve kendi "AllUniqueModel" sınıfımı ekleyebileceğimi, standart "Model" i ekleyebildiğimi ve tüm alanları enjekte etmek için bazı metaclass sihrini yapabileceğimi önerdi standart oluşturma prosedürüyle işlendikten sonra unique_togerther. ' Jtiai'nin ne anlama geldiğinden emin değilim, ama umduğumdan daha karmaşık bir çözüm gibi geliyor. – sampablokuper