Zauważyłem rzecz, której nie znam, czy jest to poważny problem, czy też robię jakiś niewłaściwy projekt.Django form integrityerror do równoczesnej pracy na unikatowych polach
Mam model:
class A(Model):
name = CharField(unique=True, max_length=255)
i ModelForm powiązane z tym ModelForm ma metodę clean_name(), która sprawdza, czy to pole jest unikalny w db (ignorować faktu, że modelforms już zrobić domyślnie określam to dla przykładu tutaj).
W widoku jeśli zrobię
o = form.save(commit=False)
# xyz
o.save()
aw #xyz
mam innego klienta, który wstawia się obiekt o tej samej wartości name
pola, o.save()
wywołuje wyjątek Integrityerror prawidłowo zapobieganie zduplikowanych rekordów do wstawienia .
Co chcę wiedzieć, jak obsługiwać te przypadki, czy powinienem opakować ten o.save()
z blokiem try/except, a następnie wypełnić pole błędu w formularzu, aby wybrać inną wartość name
?
Jest to dość powszechny przypadek, który powinien zdarzyć się każdemu, a to rozwiązanie jest okropne, więc myślę, że robię coś strasznie nie tak.
Po prostu nie rób: o = form.save()? W ten sposób następny wpis nie zostanie zatwierdzony. – cchristelis
@cchristelis w tym przypadku # xyz będzie pomiędzy form.is_valid() i form.save(). – DRC
Obejście polega na tym, aby najpierw zapisać obiekt (używając wartości dummy, jeśli niektóre pola obowiązkowe są obliczane w 'xyz'), i mają pole boolowe o nazwie' obliczanie', które ustawiłeś na 'True', gdy robisz' xyz'. Po wykonaniu dodatkowej pracy możesz ją zaktualizować/usunąć w zależności od wyniku 'xyz' i ustawić' calculating' na False. Zarówno Twoja sugestia, jak i moja, są dość hackowate, więc miejmy nadzieję, że ktoś inny zaproponuje lepszy sposób na zrobienie tego. –