Stellen Sie sich die folgende Situation vor: -
Angenommen, meine Anwendung ermöglicht es Benutzern, die Staaten / Provinzen in ihren Land zu erstellen. Nur zur Klarstellung: Wir betrachten hier nur ASCII-Zeichen hier.
In den USA könnte ein Benutzer einen Staat namens "Texas" erstellen. Wenn diese Anwendung intern verwendet wird, ist es dem Benutzer egal, ob der Staat "texas" oder "Texas" oder "teXas" geschrieben wird
Wichtig ist jedoch, dass das System die Erstellung von "texas" verhindern sollte, wenn "Texas" bereits in der Datenbank vorhanden ist.
Wenn das Modell wie folgt aussieht:
class State(models.Model):
name = models.CharField(max_length=50, unique=True)
Die Einzigartigkeit würde in Postgres zwischen Groß- und Kleinschreibung unterscheiden, d.h. Postgres würde dem Benutzer erlauben, sowohl "texas" als auch "Texas" zu erstellen, da sie als eindeutig gelten.
Was kann in dieser Situation getan werden, um ein solches Verhalten zu verhindern? Wie kann man vorgehen, wenn man Fall- unauffällig Einzigartigkeit mit Django und Postgres
Im Moment tue ich Folgendes, um die Erstellung von Fällen zu verhindern. unsensiblen Duplikaten zu verhindern.
class CreateStateForm(forms.ModelForm):
def clean_name(self):
name = self.cleaned_data['name']
try:
State.objects.get(name__iexact=name)
except ObjectDoesNotExist:
return name
raise forms.ValidationError('State already exists.')
class Meta:
model = State
Es gibt eine Reihe von Fällen, in denen ich diese Prüfung durchführen muss, und ich bin nicht scharf darauf, überall ähnliche iexact-Prüfungen schreiben zu müssen.
Ich frage mich nur, ob es eine eingebaute oder besseren Weg gibt? Vielleicht würde db_type helfen? Vielleicht gibt es auch eine andere Lösung?