ירושה מאפשרת לך לעשות שימוש חוזר בקוד וליצור מודלים נקיים יותר של נתונים. אבל ג'נגו מציע יותר מדרך אחת לרשת, אז וודא שאתה מכיר את ההבדלים.

הורשת מודלים היא תכונת Django ORM המאפשרת למפתחים ליצור קשרים היררכיים בין מודלים של מסד נתונים. הוא מאפשר שימוש חוזר בקוד, הרחבה ובסיס קוד נקי יותר על ידי מינוף העקרונות של תכנות מונחה עצמים.

בין אם אתה בונה יישום אינטרנט מורכב או עובד על פרויקט קטן יותר, תורשת מודל יכולה להציע יתרונות משמעותיים, כגון הפחתת יתירות והבטחת התנהגות עקבית.

סוגי ירושת מודל בג'נגו

Django מציעה תמיכה בשלושה סוגים של הורשת מודלים:

  1. שיעורי בסיס מופשטים.
  2. ירושה מרובה שולחנות.
  3. דגמי פרוקסי.

לכל אחד מסוגי הירושה הללו יש יתרונות ותשתמש בהם למטרות ספציפיות.

שיעורי בסיס מופשטים

מחלקות בסיס מופשטות מספקות דרך להגדיר שדות ושיטות נפוצות שמודלים מרובים יכולים לרשת. לדוגמה, אם יש לך שני מודלים החולקים שדות דומים, אתה יכול להשתמש במחלקה בסיס מופשטת כדי להגדיר את השדות הדומים. תסתכל על הדוגמה הזו:

מעמדצרכן(דגמים. דֶגֶם):
שם = דגמים. CharField (max_length=50)
מייל = דגמים. EmailField()
customer_id = מודלים. IntegerField()
instagram viewer

מעמדמוֹכֵר(דגמים. דֶגֶם):
שם = דגמים. CharField (max_length=50)
מייל = דגמים. EmailField()
seller_id = מודלים. IntegerField()

קטע הקוד למעלה מגדיר שני דגמי Django: צרכן ו מוֹכֵר. מודלים אלה חולקים שני תחומים משותפים, כלומר שֵׁם ו אימייל. כדי למנוע יתירות זו, אתה יכול ליצור מודל נפרד שיחזיק את השדות הנפוצים ב- צרכן ו מוֹכֵר מודלים ולהפוך אותו למופשט.

מעמדמידע על משתמש(דגמים. דֶגֶם):
שם = דגמים. CharField (max_length=50)
מייל = דגמים. EmailField()

מעמדמטא:
תקציר = נָכוֹן

קטע הקוד שלמעלה מגדיר מודל חדש ומגדיר את תַקצִיר מייחס ל נָכוֹן. המשמעות היא שהמודל יהיה מופשט, וג'נגו לא תיצור טבלה במסד הנתונים.

אתה יכול לשכתב את צרכן ו מוֹכֵר דגמים כמו זה:

מעמדצרכן(מידע משתמש):
customer_id = מודלים. IntegerField()

מעמדמוֹכֵר(מידע משתמש):
seller_id = מודלים. IntegerField()

בקטע הקוד למעלה, ה- צרכן ו מוכרים דגמים יורשים מה מידע על משתמש דגם במקום דגמים. דֶגֶם.

תוכל להציג את הדגמים שלך בפאנל הניהול על ידי רישוםם ב- admin.py קובץ כזה:

מ .מודלים יְבוּא לקוח, מוכר

admin.site.register (לקוח)
admin.site.register (מוכר)

העבר את המצבים שלך והפעל את שרת הפיתוח שלך על ידי הפעלת הפעולות הבאות ב-a שורת הפקודה:

python manage.py makemigrations \
&& python manage.py להעביר \
&& python manage.py שרת ריצה

נווט אל אתר הניהול שלך והתחבר עם פרטי משתמש העל שלך. אתה אמור לראות את כל שלושת השדות עבור כל דגם.

בדוגמה זו, Django יצר טבלה עבור צרכן ו מוֹכֵר דגמים. אתה יכול לראות שה מידע על משתמש למודל אין טבלה מכיוון שהוא מופשט.

ירושה מרובה שולחנות

ניתן להשתמש בירושה מרובת טבלאות כאשר מודל האב צריך להתקיים גם כטבלה במסד הנתונים לצד מודל הילד.

בניגוד להורשה מופשטת של מחלקות בסיס, שבה מודל האב לא יהיה טבלה במסד הנתונים, ירושה מרובה טבלאות יוצרת טבלה עבור מודל האב.

בירושה מרובה טבלאות, מודל הילד יורש את כל השדות והשיטות מהמודל האב שלו ומוסיף את השדות הספציפיים שלו. מפתחות זרים לעזור להקים את מערכת יחסים מודל בין מודלים של הורה וילד.

הנה דוגמה לירושה מרובה שולחנות:

מעמדאדם(דגמים. דֶגֶם):
first_name = מודלים. CharField (max_length=100)
last_name = מודלים. CharField (max_length=100)

defget_name(עצמי):
לַחֲזוֹרו"{self.first_name}{self.last_name}"

מעמדמטא:
תקציר = נָכוֹן

מעמדעוֹבֵד(אדם):
עובד_מזהה = מודלים. CharField (max_length=20)
מחלקה = דגמים. CharField (max_length=100)
שכר = דוגמניות. FloatField()
dob = דגמים. DateField()

מעמדמנהל(עוֹבֵד):
כותרת = דגמים. CharField (max_length=100)

קטע קוד זה מגדיר שלושה דגמים. הדגם הראשון, שנקרא אדם, הוא מופשט. הוא מגדיר רק את השם הפרטי והמשפחה של אדם.

הדגם השני, שנקרא עוֹבֵד, יורש את התחומים של אדם אך מגדיר שדות נוספים. ה עוֹבֵד המודל אינו מופשט, ולכן הטבלה שלו תהיה במסד הנתונים.

הדגם הסופי, שנקרא מנהל, יורש את השדות של ה עוֹבֵד מודל ומוסיף שדה שנקרא כותרת.

הקשר בין ה עוֹבֵד ו מנהל נקרא מודלים ירושה מרובה שולחנות. העבר את הדגמים שלך, רשום אותם admin.py, הפעל את השרת שלך ונווט לפאנל הניהול. אתה אמור לראות שתי טבלאות שנוצרו על ידי Django.

כשתנסה להוסיף מנהל חדש, תבחין שיש בו את כל השדות מה- עוֹבֵד דגם כמו גם שדה מותאם אישית משלו.

דגמי פרוקסי

מודל פרוקסי עוזר לך ליצור מודל חדש המשתרע ממודל קיים מבלי ליצור טבלת מסד נתונים חדשה. בסוג זה של ירושה של מודל, ה-proxy והמודלים המקוריים יחלקו את אותה טבלה. באמצעות מודלים של פרוקסי, אתה יכול לעשות דברים כמו יצירת מודלים מותאמים אישית ושינוי מנהלי ברירת מחדל.

אתה יכול ליצור מודל פרוקסי על ידי הוספה proxy=נכון בתוך ה מטא מעמד. הנה דוגמה:

מעמדProxyModel(BaseModel):

מעמדמטא:
proxy = נָכוֹן

שימוש אופייני במודל פרוקסי מתאים כאשר קיים מודל בסיס ויש צורך ליצור גרסה מיוחדת שלו עם פונקציונליות נוספת. הנה דוגמה בסיסית:

מעמדהודעה(דגמים. דֶגֶם):
כותרת = דגמים. CharField (max_length=30)
מחבר = דגמים. CharField (max_length=30)

def__str__(עצמי):
לַחֲזוֹר כותרת עצמית

מעמדProxyPost(הודעה):

מעמדמטא:
proxy = נָכוֹן

קטע קוד זה מגדיר שני דגמים: הודעה ו המודעה שלי. ה הודעה המודל מגדיר שני שדות עבור כותרת ומחבר. ה ProxyPost הדגם יורש מה הודעה דֶגֶם.

העבר את המודלים לעיל והוסף פוסט חדש לטבלה שנוצרה עבור הודעה דֶגֶם.

לאחר הוספת הפוסט, פתח את הודעות פרוקסי שולחן. אתה אמור למצוא את הפוסט שהוספת ל- הודעה שולחן בו.

השינויים שאתה מבצע בפוסטים ב- הודעות פרוקסי הטבלה תשפיע על הפוסט המתאים ב- הודעה שולחן, ולהיפך. זה מוכיח שהם באמת חולקים את אותו השולחן.

אתה יכול לשנות את str() שיטת ה-proxy:

מעמדProxyPost(הודעה):

מעמדמטא:
proxy = נָכוֹן
הזמנה = ["כותרת"]

def__str__(עצמי):
לַחֲזוֹר עצמי.מחבר

בשינוי זה, א של ProxyPost ייצוג המחרוזת יהיה המחבר שלו, לא הכותרת. ההזמנה של מודל ה-proxy תהיה גם לפי הכותרת במקום שדה ברירת המחדל של מזהה.

בעת שימוש במודלים של פרוקסי, עליך לזכור שאינך יכול להוסיף שדות מותאמים אישית למודל ה-proxy שלך. מקרה השימוש העיקרי של מודלים פרוקסי הוא כאשר אתה רוצה שמודל אחד יתמוך בהתנהגויות מרובות.

מודלים של Proxy עוזרים לך לשנות את ההתנהגות של מודל קיים מבלי לשנות את השדות שלו או את מבנה טבלת מסד הנתונים הבסיסי שלו.

השתמש בירושה של מודל עבור שימוש חוזר בקוד ומבנה ארגוני

על ידי שימוש בטכניקות השונות של הורשת מודלים, אתה יכול בקלות ליצור קוד לשימוש חוזר ומאורגן עבור הפרויקט שלך.

תורשת מודל מונעת קוד מיותר ומשפרת את יכולת התחזוקה וההרחבה של הקוד שלך. זה גם מקל על ניווט הקוד שלך, ובכך מטפח שיתוף פעולה יעיל בין צוותי פיתוח.

מלבד הורשת מודלים, Django מציעה הורשה של תבניות, שהיא דרך מצוינת לנהל ולארגן תבניות עבור הפרויקטים שלך.