Gdzie należy zatwierdzić pola modelu przejść w django?Sprawdzanie poprawności pól modelu Django
Mógłbym wymienić co najmniej dwie możliwe opcje: w przeciążonej metodzie .save() modelu lub w metodzie .to_python() podtypu model.Field (oczywiście, aby to działało, należy wpisać niestandardowe pola) .
Możliwe przypadki użycia:
- gdy jest absolutnie niezbędna do zapewnienia, że pusty ciąg nie zostanie zapisana w bazie danych (blank = False kluczowe argument nie działa tutaj, to na formularzu walidacja tylko)
- kiedy to jest konieczne w celu zapewnienia, że „wybory” słowo kluczowe argumentem dostaje przestrzegane na db poziomie, a nie tylko w panelu administratora (rodzaj emulacji typ danych enum)
Istnieje również Atrybut poziomu klasy empty_strings_allowed
w modelach. Definicja klasy bazowej i klasy pochodne z powodzeniem zastępują ją, jednak nie wydaje się, aby powodowało to jakiś wpływ na poziomie bazy danych, co oznacza, że nadal mogę konstruować model z pustymi polami i zapisywać je w bazie danych. Którego chcę uniknąć (tak, jest to konieczne).
Możliwe implementacje są
na szczeblu terenowym:
class CustomField(models.CharField):
__metaclass__ = models.SubfieldBase
def to_python(self, value):
if not value:
raise IntegrityError(_('Empty string not allowed'))
return models.CharField.to_python(self, value)
na poziomie modelu
class MyModel(models.Model)
FIELD1_CHOICES = ['foo', 'bar', 'baz']
field1 = models.CharField(max_length=255,
choices=[(item,item) for item in FIELD1_CHOICES])
def save(self, force_insert=False, force_update=False):
if self.field1 not in MyModel.FIELD1_CHOICES:
raise IntegrityError(_('Invalid value of field1'))
# this can, of course, be made more generic
models.Model.save(self, force_insert, force_update)
Może ja czegoś brakuje, a można to zrobić łatwiej (i czystsze)?
Świetnie, świetnie, po prostu świetnie! Przeszukałem źródło (tak przy okazji, czy jest jakikolwiek sposób uzyskania dostępu do dokumentacji, jak można to zrobić z pnia?) I wydaje mi się, że to właśnie jest to, czego potrzebuję. Chodzi mi o to, że jestem sam dla siebie, ale django jest doskonały w zapewnieniu jednolitego sposobu robienia rzeczy (no, w każdym razie, IMO). – shylent
Sprawdź tę gałąź, upewnij się, że masz zainstalowane docutils i Sphinx, a następnie przejdź do katalogu docs/i uruchom "make html". To powinno budować dokumenty w formie HTML, tak jak są one w witrynie Django, i można uzyskać do nich dostęp lokalnie. –
Ok, wróciłem z czytania źródła (w szczególności 'models/fields/__ init __. Py', models/base.py i core/validators.py), ponieważ dokumentacja nie mówi nic o sprawdzaniu poprawności modelu. Należy jednak zauważyć, że działa prawie tak samo jak sprawdzanie formularzy (przynajmniej ogólna logika jest mniej więcej taka sama). W każdym razie, tego właśnie szukałem. Mam tylko nadzieję, że moje aplikacje nie złamią się okropnie, jeśli przerzucę się z bagażnika do tej gałęzi. – shylent