Bir süre önce benzer bir şey yapmam gerekiyordu ve aşağıda neyle sonuçlandığımız açıklanıyor.
İki masamız var, Item ve UnfinishedItem. Kullanıcı verileri sihirbazla doldurduğunda, veriler UnfinishedItem tablosunda saklanır. Her sihirbaz adımında, sunucu bu adım sırasında girilen verileri doğrular. Kullanıcı sihirbazla işini bitirdiğinde, sihirbaz gönderilecek tüm verileri gösteren bir onay sayfasında gizli / salt okunur bir form oluşturur. Kullanıcı bu sayfayı inceleyebilir ve hataları düzeltmek için ilgili adıma geri dönebilir. Kullanıcı girdilerinden memnun kaldığında, kullanıcı gönder'i tıklatır ve sihirbaz gizli / salt okunur form alanlarındaki tüm verileri API sunucusuna gönderir. API sunucusu bu isteği işlediğinde, sihirbazın her adımı sırasında yaptığı tüm doğrulamaları yeniden çalıştırır ve tek tek adımlara uymayan ek doğrulamalar gerçekleştirir (örn. Genel doğrulamalar, pahalı doğrulamalar).
İki tablo yaklaşımının avantajları:
veritabanında, Öğe tablosunda UnfinishedItem tablosundan daha sıkı kısıtlamalar olabilir; sihirbaz tamamlandığında gerçekten gerekli olacak isteğe bağlı sütunlara sahip olmanız gerekmez.
Bitmemiş Öğeler'deki toplam sorgular, UnfinishedItems'i hariç tutmayı hatırlamanız gerekmediğinden raporlama için daha kolaydır. Bizim durumumuzda, Item ve UnfinishedItems arasında toplu sorgular yapmamıza gerek yoktu, bu yüzden bu bir sorun değil.
Dezavantaj:
- Doğrulama mantığının kopyalanmasına eğilimlidir. Kullandığımız web çerçevesi Django, Item ve UnfinishedItem'de farklı olmamız gereken kısıtlamaları değiştirmek için biraz meta büyü ile model mirasını kullandığımız için bunu biraz daha katlanılabilir hale getiriyor. Django, veritabanının çoğunu oluşturur ve modelden doğrulama işlemini gerçekleştirir ve bunun üzerine yalnızca birkaç ek doğrulama yapmamız gerekir.
Düşündüğüm diğer olasılıklar ve neden onlarla gitmedik:
- verileri çerezlere veya yerel depolama alanına kaydetme: kullanıcı farklı bir cihazdan veya tarayıcı geçmişini silmeye devam edemez
- UnfinishedItem'i veritabanında veya ikincil veri deposunda yapılandırılmamış veriler (örn. JSON) olarak saklayın: Ayrıştırma mantığını tanımlamam gerekiyor ve Django'nun otomatik modeli / form doğrulamasını kullanamıyorum.
- istemci tarafında adım başına doğrulamayı yapın: Python / Django ve JavaScript arasında doğrulama mantığını çoğaltmam gerekecek.