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

السؤال

نشر

قمت بعمل تابه __init__  في أحد النماذج model الخاصة بي بالشكل التالي:

def __init__(self, title, content, description):
    models.Model.__init__(self)
    self.title = title
    self.content = content
    self.description = description

أقوم بعمل هذا التابع حتى يمكنني عمل كائنات جديدة من خلال الكود التالي:

p = Post('my post title','some content', 'summary of the post')

كان هذا النموذج يعمل بشكل سليم عندما أقوم بحفظ كائن جديد إلى قاعدة البيانات، ولكن تحدث المشكلة عندما أقوم بإستخدام الكود التالي:

Post.objects.all()

حيث لا يتم إرجاع أي شيء من قاعدة البيانات، ويجب أن أقوم بإزالة التابع  __init__  لكي يعمل السطر السابق.

كيف أحل هذه المشكلة في جانغو Django؟

Recommended Posts

  • 1
نشر

توثيق جانغو لا ينصح بتغيير التابع __init__ في النماذج (Models) ﻷنه قد يؤدي إلى خلل في حفظ البيانات وإنما ينصح ب:

  • إنشاء دالة ثابتة (classmethod) في النموذج:
    class Post(models.Model):
        ....
        @classmethod
        def create(cls, title, content, description):
            post = cls(title=title, content=content, description=description)
            return post

    ويتم استدعاؤها على الشكل التالي:

    p = Post.create('my post title','some content', 'summary of the post')

     

  • إضافة تابع إلى مدير النموذج (Manager) - عادةً هذا ما ينصح به- :

    #نقوم بإنشاء مدير مخصص
    class PostManager(models.Manager):
        def create_post(self, title, content, description):
            post = self.create(title=title, content=content, description=description)
            
            return post
    
    class Post(models.Model):
        ...
    
        #تعيين مدير النموذج
        objects = PostManager()

    ويتم استدعاء هذا التابع على الشكل التالي:

    p = Post.objects.create_post('my post title','some content', 'summary of the post')

     

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...