Chcę upewnić się, że obiekt jest unikalny i rzucić błąd, gdy użytkownik próbuje go zapisać (np. Przez administratora), jeśli nie? Przez unikatowy, mam na myśli, że niektóre z atrybutów obiektu mogą mieć te same wartości, co inne obiekty, ale nie mogą one być ALL identyczne z wartościami innego obiektu.DRY unikatowe obiekty w Django
Jeśli się nie mylę, mogę to zrobić tak:
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")
Ale za każdym razem byłaby modelu (np dodać nowe pole, lub zmienić nazwę istniejącego pola), Muszę również edytować listę pól w nawiasach przypisanych do unique_together. Z prostym modelem, to jest w porządku, ale z istotnym, staje się prawdziwym kłopotem podczas refaktoryzacji.
Jak można uniknąć powtarzania pisania listy nazw pól w nawiasach unique_together? Czy jest jakiś sposób przekazania listy pól modelu do zmiennej i zamiast tego przypisać tę zmienną do unique_together?
+1 - wielki pytanie. Nie sądzę, że możesz, ale jestem zainteresowany słuchaniem opinii innych. –
+1 - To naprawdę interesujące, jeśli ktoś znajdzie dobre rozwiązanie. Próbowałem, ale nie mogłem sprawić, by działało to poprzez odbicie, ponieważ nie można odczytać właściwości z klasy Animal (co jest oczywiste, ponieważ Animal nie jest w tym momencie całkowicie zdefiniowany). – FlorianH
jtiai na irc: //irc.freenode.net/django uprzejmie poświęciłem trochę czasu na omówienie pytania i zasugerowałem, żebym mógł "dodać własną klasę" AllUniqueModel ", dziedziczyć standardowy" Model "i zrobić magię metaclass, aby wstrzyknąć wszystkie pola w unique_togerther po przetworzeniu przez standardową procedurę tworzenia. " Nie jestem do końca pewien, co to ma znaczenie dla jtiai, ale brzmi to jak bardziej skomplikowane rozwiązanie, niż miałem nadzieję. – sampablokuper