اذهب إلى المحتوى
  • 0

توضيح حول ألية الوراثة في اطار العمل دجانغو

Zeina Almakdisi

السؤال

مرحبا لدي كلاس اب Center

class Center(models.Model):
  user        = models.OneToOneField(User , verbose_name=_("user"), on_delete=models.CASCADE)
  name       =models.CharField(_("Name:"),max_length=50)
  subtitle      =models.CharField(_("Who_II:"),max_length=50)
  address       =models.CharField(_("Address:"),max_length=50)
  address_detial=models.CharField(_("address_detial:"),max_length=50)
  number_phone  =models.CharField(_("number_phone:"),max_length=50,unique=False)
  who_I         =models.TextField(_("Who I"),max_length=250, unique=True)

احتاج الى جعل جميع الكلاسات ان ترث منه 

مثلا جعل كلاس clinic يرث من Center

class Clinic(models.Model):

  name_doctor       =models.CharField(_("Name_Doctor:"),max_length=50)
  working_hours =models.CharField(_("working_hours:"),max_length=50,unique=False)
  waiting_time  =models.IntegerField(_("waiting_time"), unique=True)
  price         =models.IntegerField(_("Price is"), unique=True)
  slug          =models.SlugField(_("slug")  )

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

مرحبا زينة،

الوراثة ( Inheritance ) في جانغو أو في بايثون هي تضمين محتوى كلاس في كلاس آخر.

في بايثون, الصنف يمكنه أن يرث من صنف آخر حتى يحصل على الدوال و المتغيرات الموجودة فيه.

لجعل الصنف يرث من صنف آخر, نضع بعد إسم الصنف قوسين و بداخلهما إسم الصنف الذي نريده أن يرث منه.

في حال كان الصنف يرث من أكثر من صنف, يجب وضع فاصلة بين كل صنفين نضعهما بين القوسين.

مثال على ذلك:

# print_msg و دالة إسمها x يحتوي على متغير إسمه A هنا قمنا بتعريف صنف إسمه
class A:
    
    x = 10
    def print_msg(self):
        print('Hello from class A')
        
        
# y و يحتوي على متغير إسمه A يرث من الصنف B هنا قمنا بتعريف صنف إسمه
class B(A):
    y = 20

يعني حتى نجعل الصنف  Clinic يرث من الصنف Center نقوم ب:

class Clinic(Center):

  name_doctor       =models.CharField(_("Name_Doctor:"),max_length=50)
  working_hours =models.CharField(_("working_hours:"),max_length=50,unique=False)
  waiting_time  =models.IntegerField(_("waiting_time"), unique=True)
  price         =models.IntegerField(_("Price is"), unique=True)
  slug          =models.SlugField(_("slug")  )

للإستزادة أكثر حول الوراثة في بايثون يمكنك قراءة مقالة:

أو زيارة موسوعة حسوب.

تحياتي،

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

في دجانغو هناك عدة أنواع من الوراثة، حيث أن ال model يختلف عن الصف العادي بأنه يمثل جدول في قاعدة البيانات، بالتالي هناك عدة خيارات لدينا.

الوراثة المجردة

في حال أردنا كتابة صف مشترك و لكن لا نريد إنشاء جدول لذلك الصف، أي نقوم بكتابته لوضع صفات مشتركة و إضافتها إلى صفوف الأبناء (و بالتالي إلى الجدول الخاص بالابن في حال كان لديه واحد).
أي مثلاً في حالتك قد لا تريدين وجود جدول خاص للصف Center فيمكنك إضافة ما يلي إليه:

class Center(models.Model):
  # الكود الخاص بك 

  # كيفية تحقيق ما سبق و شرحته
  class Meta:
    abstract = True

 

الوراثة متعددة الجداول

في حال كان يجب للصف الأب أن يكون له جدول خاص به فيمكننا كتابة وراثة عادية للصفوف في بايثون و هذا سيجعل دجانغو ينشئ جدول لكل صف.

وراثة الوسيط 

النمط الثالث يدعى الوسيط proxy حيث يمكن إنشاء صف ابن يرث صف أب، بحيث يكون للصف الأب جدول بينما لا يكون للصف الابن جدول، و هنا دور الابن مجرد إضافة طرائق معينة للتعامل مع الجدول الذي يملكه الصف الأب.
أي الابن مجرد وسيط يمكن عن طريق تنفيذ تعليمات تنفذ على الجدول الخاص بالصف الأب.
نقوم عادة باستعمال هذا النوع من الوراثة في حال كنا مهتمين بإضافة طرائق خاصة للتعامل مع البيانات إلى صف ما، بحيث تكون هذه الطرق معرفة فقط في الصف الابن ( أي لا نريدها أن تكون متوفرة لمن يتعامل مع الصف الأب مباشرة).
مثال على ذلك:

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

class MyPerson(Person):
    class Meta:
        proxy = True

    def do_something(self):
        # ...
        pass

هنا من يتعامل مع الصف Person مباشرة لن يستطيع استعمال الدالة do_something بينما من يتعامل مع الصف MyPerson يستطيع، و كلاهما يتعاملان مع نفس الجدول، و الذي هو جدول مرتبط بالصف الأب Person.
في هذا النمط يمكن فقط إضافة توابع للتعامل مع البيانات في الجدول الأب و ليس من المسموح إضافة صفات إضافية، حيث أن ذلك ممكن فقط في حال كان للابن جدول خاص به، و هنا الأمر ليس كذلك.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...