Nadal próbuję zrozumieć poprawny sposób sprawdzania poprawności obiektu modelu Django za pomocą niestandardowego weryfikatora na poziomie modelu. Wiem, że sprawdzanie poprawności odbywa się zwykle w formie formularza lub modelu. Jednak chcę zapewnić integralność moich danych na poziomie modelu, jeśli wchodzę z nim w interakcję za pośrednictwem ORM w powłoce Pythona. Oto moje obecne podejście:Prawidłowy sposób sprawdzania poprawności obiektów modelu Django?
from django.db import models
from django.core import validators
from django.core exceptions import ValidationError
def validate_gender(value):
""" Custom validator """
if not value in ('m', 'f', 'M', 'F'):
raise ValidationError(u'%s is not a valid value for gender.' % value)
class Person(models.Model):
name = models.CharField(max_length=128)
age = models.IntegerField()
gender = models.CharField(maxlength=1, validators=[validate_gender])
def save(self, *args, **kwargs):
""" Override Person's save """
self.full_clean(exclude=None)
super(Person, self).save(*args, **kwargs)
Oto moje pytania:
należy utworzyć niestandardową funkcję sprawdzania, wyznacza ją jako weryfikatora, a następnie zastąpić osoby save() funkcja, jak ja” ve zrobione powyżej? (Nawiasem mówiąc, wiem, że mogłem potwierdzić moje wybory dotyczące płci przy użyciu opcji pola "wyboru", ale stworzyłem "validate_gender" w celu ilustracji).
Gdybym naprawdę chce zapewnić integralność moich danych, nie powinien piszę tylko testy jednostkowe Django do testów w warstwie modelu, ale również testy jednostkowe odpowiednik na poziomie bazy danych przy użyciu Python/Psycopg? Zauważyłem, że testy jednostkowe Django, które podnoszą wartości ValidationErrors, sprawdzają tylko model zrozumienia schematu bazy danych za pomocą kopii bazy danych. Nawet jeśli używałbym Południa do migracji, wszelkie ograniczenia na poziomie bazy danych są ograniczone do tego, co Django może zrozumieć i przetłumaczyć na ograniczenie PostgreSQL. Jeśli potrzebuję niestandardowego ograniczenia, którego nie może replikować Django, mogę potencjalnie wprowadzić dane do mojej bazy danych, które naruszają to ograniczenie, jeśli wchodzę w interakcję z bazą danych bezpośrednio za pośrednictwem terminala psql.
Dzięki!
Nie jestem pewien, jak pytanie 1 różni się od poprzednich pytań na ten temat. Zauważ, że nadal nie zapobiega wstawianiu nieprawidłowych danych za pomocą ORM. Rozważ "Person.objects.update (gender =" a ")'. – Alasdair
Masz rację, z wyjątkiem tego, że w poprzednim pytaniu nie zawierałem funkcji sprawdzania poprawności, tak jak tutaj. Jeśli chodzi o twoją drugą obserwację dotyczącą .update, domyślam się, że mam teraz dodatkowy problem, który dodaje do mojego zamieszania.Naprawdę walczę ze zrozumieniem, co jest właściwym sposobem na zrobienie tego. Podczas gdy dokumentacja Django jest całkiem niezła, IMHO, są one długie na fragmentach i "machaniu ręką", ale brakuje im pełnych przykładów, które pomogłyby "nowicjuszowi", takim jak ja, zrozumieć prawidłowy sposób rozwiązania tego problemu. Niestety, pracuję sam i nie mam bardziej doświadczonych programistów, którzy mogliby to omówić. – William