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

ما الفرق بين abstract model وصنف عادي class في جانغو Django؟

Mohssen A Mohssen

السؤال

لماذ يجب أن أستعمل 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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...