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

السؤال

نشر

لماذ يجب أن أستعمل abstract model في جانغو Django بدلًا من صنف عادي في بايثون، ما المشكلة في الكود التالي:

class Post:
   title = models.CharField(...)

   def get_content(self):
       return self.content

لماذا علي تحويله إلى الشكل التالي:

class Post(models.Model):
   title = models.CharField(...)

   def get_content(self):
       return self.content

   class Meta:
       abstract = True

ما الفرق بين الصنفين السابقين؟ وهل توجد حالات تجعلني أستعمل صنف بايثون عادي؟

Recommended Posts

  • 1
نشر

لا يمكن إستخدام الأسطر البرمجية بشكل مباشر حيثُ يجب إستخدامها هكذا :

class Post(models.Model):
   title = models.CharField(...)

   def get_content(self):
       return self.content

   class Meta:
       abstract = True

و ذلك لأن في Django يتم وراثة و تعريف كل متغير من مكتبات تم تثبيتها مُسبقاً في بيئة django مثال إذا حذفت models.Model فلن يعمل السطر البرمجي لأنه يجب تعريف لـ django كيف يجب عليه أن يتعامل مع ال models حتى يسهل التعامل معها و تطبيقها في قاعدة البيانات المستخدمه في settings.py 

أما عن  abstract = True فهي تهدف لعدم تكرار جدول البيانات مره اخرى في قاعدة بيانات django أي على سبيل المثال :

class School(models.Model): 
    name = models.CharField(max_length=100)
    number = models.IntergerField()
  
  
class Student(models.Model):  
    name = models.CharField(max_length=100)
    Phone = models.IntergerField()
    
# نلاحظ هنا أن الحقل name مكرر

نلاحظ أن الحقل name مُكرر في النموذجين و لمنع كتابة الحقول بشكل متكرر دائماً يتم إنشاء نموذج منفرد مثل :

class CommonInfo(models.Model):
    name = models.CharField(max_length=100)

    class Meta:
        abstract = True

لاحظت إضافة abstract = True حيث يتم وراثة ذلك النموذج عند انشاء النماذج بعد ذلك كالتالي :

class School(CommonInfo): 
    number = models.IntegerField()
  
  
class Student(CommonInfo):  
    phone = models.IntegerField()

و عند تطبيق الأمرين python manage.py makemigrations 

و الأمر python manage.py migrate سيتم إنشاء الحقل name كأن تم كتابته في النموذجين و لكن بالأصل قمنا بوراثته من class كما لاحظت أن ال class ورث من CommonInfo لتوريث كافة الحقول به لأي نموذج يتم إستدعاؤه به

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...