צריך ליצור מחלקת מודל לישות. יש שתי דרכים לעשות את זה:
- יוצרים מחלקת מודל שמגדירה את מאפייני הישות.
- יוצרים מחלקה של מודל expando שלא מגדירה מראש ישויות.
במאמר הזה נסביר איך ליצור כל אחד מסוגי המחלקות של המודלים.
בנוסף, מוסבר איך ליצור וו (hook) של מודל, כדי שהאפליקציה תוכל להריץ קוד מסוים לפני או אחרי סוגים מסוימים של פעולות, למשל לפני כל get().
יצירת מחלקה של מודל עם מאפיינים
לפני שיוצרים ישות, צריך ליצור מחלקת מודל שמגדירה מאפיין ישות אחד או יותר. לדוגמה:
...
כאשר רוצים שלכל ישות Account יהיו מאפיינים של שם משתמש, מזהה משתמש וכתובת אימייל.
רשימה מלאה של סוגי הנכסים זמינה בחומר העזר בנושא נכסי ישויות.
יצירת מחלקת מודל Expando
לא צריך להשתמש במחלקת מודל שמגדירה מאפיינים מראש.
מחלקת משנה מיוחדת של מודל שנקראת Expando משנה את ההתנהגות של הישויות שלה כך שכל מאפיין שמוקצה נשמר במאגר הנתונים. הערה: אי אפשר להתחיל מאפיינים כאלה בקו תחתון.
כך יוצרים מודל Expando:
...
הפעולה הזו כותבת ישות למאגר הנתונים עם מאפיין foo עם ערך שלם 1, מאפיין bar עם ערך מחרוזת 'blah' ומאפיין חוזר tag עם ערכי מחרוזת 'exp', 'and' ו-'oh'. המאפיינים עוברים אינדוקס, ואפשר לבדוק אותם באמצעות מאפיין _properties של הישות:
ל-Expando שנוצר על ידי קבלת ערך ממאגר הנתונים יש מאפיינים לכל ערכי המאפיינים שנשמרו במאגר הנתונים.
אפליקציה יכולה להוסיף מאפיינים מוגדרים מראש לExpando מחלקת משנה:
...
כך מקבלים את המאפיין name עם הערך 'Sandy', את המאפיין age עם הערך None ואת המאפיין הדינמי location עם הערך 'SF'.employee
כדי ליצור מחלקת משנה Expando שהמאפיינים שלה לא מתווספים לאינדקס, צריך להגדיר _default_indexed = False בהגדרת מחלקת המשנה:
...
אפשר גם להגדיר את _default_indexed בישות Expando. במקרה כזה, ההגדרה תשפיע על כל הנכסים שהוקצו אחרי שהיא נקבעה.
טכניקה שימושית נוספת היא שליחת שאילתה מסוג Expando לנכס דינמי. שאילתה כמו הבאה
לא יעבוד, כי למחלקה אין אובייקט מאפיין למאפיין המיקום. במקום זאת, צריך להשתמש ב-GenericProperty, המחלקה Expando משתמשת במאפיינים דינמיים:
שימוש ב-Model Hooks
NDB מציע מנגנון קל משקל לחיבור. הגדרת hook מאפשרת לאפליקציה להריץ קוד מסוים לפני או אחרי סוגים מסוימים של פעולות. לדוגמה, Model יכול להריץ פונקציה מסוימת לפני כל get().
פונקציית hook מופעלת כשמשתמשים בגרסאות הסינכרוניות, האסינכרוניות והמרובות של השיטה המתאימה. לדוגמה, וו 'pre-get' יחול על כל המיקומים get(), get_async() ו-get_multi(). יש גרסאות של כל ווּק לפני קריאת RPC ואחרי קריאת RPC.
ה-Hooks יכולים לעזור במקרים הבאים:
- שמירה במטמון של שאילתות
- ביקורת פעילות ב-Cloud Datastore לפי משתמש
- חיקוי של טריגרים של מסד נתונים
בדוגמה הבאה אפשר לראות איך מגדירים פונקציות hook:
...
...
אם משתמשים ב-post-hooks עם ממשקי API אסינכרוניים, ה-hooks מופעלים על ידי קריאה ל-check_result(), ל-get_result() או להחזרת ערך (בתוך tasklet) של future של שיטה אסינכרונית. ה-hooks של הפוסט לא בודקים אם ה-RPC הצליח. ה-hook פועל ללא קשר לכישלון.
לכל ה-post-hooks יש ארגומנט Future בסוף חתימת הקריאה. אובייקט Future הזה מכיל את תוצאת הפעולה. אפשר להתקשר אל get_result()
בFuture כדי לאחזר את התוצאה. אפשר להיות בטוחים שget_result()
לא ייחסם, כי Future הושלם עד שה-hook נקרא.
העלאת חריגה במהלך פעולת pre-hook מונעת את ביצוע הבקשה.
למרות שה-hooks מופעלים בתוך <var>*</var>_async methods, אי אפשר למנוע RPC על ידי העלאת tasklets.Return ב-hook שלפני ה-RPC.