تخطي للذهاب إلى المحتوى

الحقول المحسوبة المخزنة في Odoo: الدليل الشامل

تعرف على فكرة الحقول المحسوبة المخزنة في أودو: ماذا تفعل، متى تفيدك، وكيف تُنشَأ سواء ببايثون أو عبر واجهة أودو ستوديو. سنشرح متى تختار تخزين نتيجة الحقل بدل حسابها في كل استعلام، ما يترتب على ذلك من أداء وتوافقية مع عوامل فلترة وتصفيح التقارير، وما تحتاجه من اعتبارات عن التحديث والنسخ الاحتياطي. كما سنرشدك خطوة بخطوة لصياغة الحقل في كود بايثون — تعريف الحقل، الديكوراتور المناسب للحفظ، ومراعاة الحقول المعتمدة triggers — ونوضح بديلًا كيف تنشئ نفس الحقل بدون كتابة سطر واحد باستخدام أدوات أودو ستوديو، مع أمثلة واقعية ونصائح عملية لتجنب المشاكل الشائعة مثل التزامن وقيود الترتيب.
6 مارس 2026 بواسطة
الحقول المحسوبة المخزنة في Odoo: الدليل الشامل
Dasolo
لا توجد تعليقات بعد

مقدمة


إذا اشتغلت على أودو لفترة، ستصادف حقولًا تُحسب قيمتها تلقائيًا. الحقل المحسوب المخزن يذهب أبعد من ذلك: يُنفّذ الحساب ثم يخزّن الناتج مباشرة في قاعدة البيانات كعمود حقيقي.


هذا الفرق مهم عمليًا. الحقول المحسوبة التي لا تُخزن تُعرض لحظيًّا ولا تصلح لأن تُستخدم بفاعلية في عمليات البحث أو التصفية أو التجميع أو التصدير. أما الحقل المخزن فيُعامل كأي عمود قاعدة بيانات عادي ويمكن استخدامه في هذه العمليات بكفاءة.


في هذا الدليل ستجد كل ما تحتاجه عن الحقول المحسوبة المخزنة في أودو: مبدأ عملها داخل نموذج البيانات، كيف تضيفها بسرعة عبر أدوات الواجهة أو بعمق عبر بايثون، أمثلة عملية من أعمال حقيقية، والأخطاء التي غالبًا ما يقع فيها المطورون.

ما هو الحقل المحسوب المخزن في أودو


داخل ORM الخاص بأودو، كل حقل يمثل قطعة من البيانات على السجل. معظم الحقول تُملأ بواسطة المستخدم. الحقل المحسوب يختلف: قيمته لا يدخلها المستخدم بل تُنتجها دالة برمجية في بايثون.


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


المبدأ العام في بايثون بسيط:

مثال برمجي يوضح تعريف حقل محسوب مخزن ودالة تحسب إجمالي المبلغ بناءً على الكمية وسعر الوحدة.

معامل التخزين هو الفارق الحاسم: store=True هو ما يجعل القيمة تُحفظ في قاعدة البيانات بدل أن تُحسب في كل مرة تُعرض فيها.


في واجهة أودو يظهر الحقل المخزن كمكوّن عادي في النماذج والقوائم والتقارير. يمكن تصفيته وتجميعه وتصديره، ولا يظهر للمستخدم أي علامة تُدلُّ على أنه محسوب خلف الكواليس.


المقارنة: مخزن أم غير مخزن؟

فهم الفارق أساسي لكل من يبني أو يخصّص أودو:

  • حقل محسوب غير مخزن: يُحسب عند القراءة فقط. لا يمكن استخدامه في عمليات البحث أو التجميع. أقل استهلاكًا للمساحة لكنه غير قابل للاستعلام في SQL.
  • حقل محسوب مخزن: يُعاد حسابه عند تغيُّر التبعيات ويحفظ في قاعدة البيانات. قابل للبحث والتصفية والتصدير ويشغل مساحة مثل أي عمود آخر.

الاختيار بينهما ليس مسألة أفضليةٌ عامة بل اعتمادًا على الاستخدام. إن كنت تريده للعرض فقط على نموذج واحد فالحقل غير المخزن غالبًا يكفي. إن كنت بحاجة للتصفية أو التجميع أو الفرز، فاختَر الحقل المخزن.

كيف يعمل الحقل


عند تعريف حقل مخزن، يقوم ORM بأودو بإنشاء آلية لإعادة الحساب تلقائيًا اعتمادًا على الحقول التي تحددها في @api.depends().


حين تتغير أي من تلك الحقول على سجل معين، يُعلَم أودو بأن السجل يحتاج لإعادة حساب، فتُنفّذ الدالة ويُكتب الناتج في عمود الجدول المخصص لذلك.


دورة حياة إعادة الحساب

الخطوات المتتابعة لعملية إعادة الحساب هي:

  1. تغيير من قبل مستخدم أو عملية تلقائية في حقل مذكور ضمن @api.depends().
  2. يكتشف أودو هذا التغيير ويحدد السجلات المتأثرة.
  3. يُستدعى أسلوب الحساب لتلك السجلات.
  4. تكتب القيمة المحسوبة في عمود قاعدة البيانات.
  5. يصبح الحقل جاهزًا للبحث والتصفية والتصدير بالقيمة المحدثة.

في العادة تتم إعادة الحساب داخل نفس المعاملة فورًا، لكن في عمليات دفعات كبيرة قد يؤجِّل أودو بعض المهام ويعالجها في الخلفية.


تبعية عبر نماذج مرتبطة

يمكن لتزيين @api.depends() أن يعبر عن مسارات نقطية للوصول إلى حقول في نماذج مرتبطة، مثل:


مثال يبيّن كيف يعتمد الحقل على اسم البلد عبر علاقة partner_id.country_id.name ويملأ قيمة اسم البلد على السجل الحالي.

في هذه الحالة يتتبع أودو التغيرات عبر الشركاء والبلدان والاسم؛ فإذا تغيّر اسم البلد على شريك مرتبط، تُعاد حسابات كل السجلات المعتمدة — وهذه قدرة قوية في إطار عمل أودو.


تأثير على قاعدة البيانات

بما أن الحقل مخزن، ينشئ أودو عمودًا حقيقيًا في جدول PostgreSQL. هذا يجعل الحقل جزءًا من استعلامات SQL، فعمليات البحث والتصفية على الحقول المخزنة تعمل بسرعة مشابهة للحقول الاعتيادية.

حالات استخدام عملية


إليك أمثلة عملية من الحياة اليومية للأنشطة التجارية تظهر أين يفيد الحقل المخزن.


1. مبيعات: نسبة الهامش على سطور الطلب

يمكن حساب هامش الربح لكل سطر في أمر البيع وتخزينه، ليتمكّن مدير المبيعات من تصفية السطور حسب نسبة الهامش، اكتشاف السطور غير المربحة بسرعة، وتجميعها في تقارير محورية دون الحاجة لفتح كل سطر.


2. إدارة العملاء (CRM): الأيام منذ آخر نشاط على فرصة

حقل مخزن يقيس عدد الأيام منذ آخر نشاط مجدول على صفقة. مع مهمة مجدولة تعيد حساب الحقول يوميًا، يصبح بإمكان الفريق تصفية العملاء غير النشطين تلقائيًا دون تتبع يدوي.


3. مخزون: الكمية المتاحة الصافية

لمنتجات ذات قواعد مخزون معقّدة يمكن تخزين قيمة مسبَقَة مثل الكمية المتاحة بعد خصم المحجوزات، حتى يتمكن مديرو المخزون من الفرز والتصفية دون تشغيل حسابات مخزون معقدة لكل صف على الشاشة.


4. محاسبة: عدد الفواتير المتأخرة لكل عميل

على جهة الاتصال يمكن حصر عدد الفواتير المتأخرة وتخزينه في حقل مخزن، ليصبح من السهل فرز العملاء بحسب عدد الفواتير المتأخرة بنقرة واحدة.


5. تصنيع: إجمالي زمن العمل المقدر

في قائمة المواد يمكن جمع مدة العمليات المرتبطة بكل BOM وتخزين الناتج، ما يساعد مخططَي الإنتاج في فرز BOMs حسب وقت العمل للتخطيط السعوي والجدولة. يتحدَّث الحقل آليًا كلما أضيفت عملية أو تغيّرت.

إنشاء الحقل أو تخصيصه


طريقتان رئيسيتان لإضافة حقول مخزنة: عبر أودو ستوديو للحالات البسيطة، أو بكتابة كود بايثون داخل وحدة مخصصة للتحكم الكامل.


باستخدام أودو ستوديو

يوفّر ستوديو واجهة لإنشاء حقول محسوبة دون كتابة كود. عند إنشاء حقل رقمي يمكنك تفعيل خيار تركيبة يقبل تعابير تشبه بايثون. ستوديو يتكفّل بتتبُّع التبعيات تلقائيًا في الحالات البسيطة.


حقول ستوديو مناسبة للعمليات الحسابية البسيطة بين حقول داخل نفس السجل. سريعة وسهلة بدون بيئة تطوير، لكن حدودها تظهر إذا احتجت إلى حقول نماذج مرتبطة، تشعبات شرطية أو تجميع عبر سجلات فرعية — حينها تحتاج إلى وحدة مخصصة.


هذا فارق مهم عند التخطيط لتخصيص أودو: ستوديو مناسب للحالات السريعة، والبايثون يمنحك المرونة عند تعقّد المنطق.


باستخدام وحدة بايثون مخصصة

عند الحاجة لمنطق أعمق تعرّف الحقل في بايثون داخل وحدة مخصصة. مثال عملي يضيف حقل نسبة الهامش على سطر فاتورة/طلب المبيعات.


المثال يبيّن تعريف الحقل، تعيين compute و store=True، وتابع يعتمد على سعر البيع وسعر الشراء لحساب النسبة، مع تعامُل مع حالة عدم وجود سعر.

بعد تثبيت الوحدة، ينشئ أودو عمود x_margin_pct في قاعدة البيانات، يشغّل الدالة على السجلات الحالية ويبدأ متابعة التغيُّرات في الحقول المعتمدة.


بادئة الحقول x_ هي ممارسة شائعة للحفاظ على تمييز الحقول المخصصة عن الحقول الأساسية وتجنُّب التضارب.


جعل الحقل المحسوب المخزن قابلاً للتعديل

بشكل افتراضي الحقول المحسوبة للقراءة فقط. إذا أردت أن يسمح المستخدم بتعديل القيمة يدويًا، تُعرّف دالة inverse مرافقة لدالة compute. عند كتابة المستخدم للقيمة تعمل inverse لتحديث الحقول المصدر. هذا مفيد عندما تكون القيمة المحسوبة قيمة افتراضية يمكن تجاوزها يدويًا.


حقول ستوديو وواجهة XML-RPC

عبر XML-RPC يمكنك إنشاء حقول عادية عبر نموذج ir.model.fields. لكن منطق الحقول المحسوبة المخصص يجب أن يعيش في كود الخادم. الواجهة مفيدة لإنشاء الحقول تلقائيًا، لكن دوال الحساب تتطلب وحدة مثبتة على السيرفر.

ممارسات مُوصى بها


ممارسات يتبعها المستشارون المحترفون عند العمل مع الحقول المخزنة.


حدد كل التبعيات بدقة

زخرفة @api.depends() يجب أن تحوي كل حقل تقرأه دالة الحساب. إن نسيت أحدها لن تُعاد الحسابات عند تغيُّر تلك القيمة. راجع كودك سطرًا بسطر وضع كل مسار وصول للحقول في الزخرفة.


اجعل دوال الحساب سريعة

دالتك ستعمل على كل سجل متأثر؛ في نظام مزدحم قد تكون آلاف السجلات. تجنّب استعلامات إضافية داخل compute. إذا احتجت بيانات مرتبطة اعتمد على الحقول المحمّلة بدل تنفيذ بحثات متعددة.


استخدم store=True فقط عند الحاجة

الحقول المخزنة تستهلك مساحة وتؤدي إلى عمليات كتابة عند كل إعادة حساب. إن كان الغرض العرض فقط دون تصفية أو تجميع، فالحقول غير المخزنة أخف. قرّر هذا بعناية بدلاً من جعل كل شيء مخزن افتراضيًا.


تعامل مع حالات الحافة في دالة الحساب

احسب احتمالات القيم الفارغة أو المفقودة داخل compute. القسمة على صفر أو غياب سجل مرتبط أو قيم null تُسبب أخطاء أو نتائج قديمة. ضع شروطًا افتراضية آمنة عندما لا يمكن إتمام الحساب.


خطط لإعادة الحساب الأولية على الجداول الكبيرة

عند تثبيت وحدة تضيف حقلًا مخزنًا يعيد أودو حسابه لكل السجلات القائمة. على جداول مئات الآلاف من الصفوف يتطلب وقتًا كبيرًا. اختبر الترحيل في بيئة Stage وخطط لفترات توقف محتملة أو معالجة في الخلفية عند النشر.


تجنّب التبعيات الدائرية

إن اعتمد الحقل A على B وB على A سيطرح أودو خطأ عند تحميل الوحدة. صمّم تبعيات الحقول باتجاه واحد واضح.

أخطاء شائعة يجب تجنّبها


نسيان store=True

هذا الخطأ الأكثر شيوعًا. الحقل قد يظهر بشكل طبيعي على النموذج أثناء الاختبار، لكن عند محاولة استخدامه في فلتر أو تقرير يتبيّن أنه غير قابل لذلك. قرّر قبل كتابة المنطق إن كنت تحتاج قابلية البحث، وإذا نعم ضع store=True منذ البداية.


نسيان تبعية في @api.depends

إن قرأت دالتك partner_id.country_id لكنك ضمّنت فقط partner_id في الزخرفة فلن تُعاد الحسابات عند تغيّر البلد. تتبّع كل مسار وصول وضع كل خطوة صراحة في الزخرفة.


أخطاء صامتة في دالة الحساب

إذا رمت دالة الحساب استثناءً لسجلٍ ما، يتجاهل أودو إعادة الحساب لذلك السجل ويترك القيمة القديمة في الحقل المخزن. قد يظهر الخطأ في السجلات لكن المستخدم لن يلاحظه، ما يؤدي إلى بيانات قديمة يصعب تعقبها. اختبر دالتك على سجلات ذات بيانات مفقودة أو غير اعتيادية.


تدهور الأداء على مجموعات بيانات كبيرة

دالة تعمل بسلاسة أثناء التطوير قد تتحول لعنق زجاجة في الإنتاج إذا نما الجدول لعشرات الآلاف من السجلات. راقب عدد استعلامات قاعدة البيانات التي يؤديها كل سجل؛ استعلام إضافي واحد مضروبًا بعشرة آلاف يصبح عشرة آلاف استعلام عند عملية حفظ واحدة.


استخدام sudo() داخل دوال الحساب

استدعاء sudo() لتجاوز صلاحيات الوصول داخل compute يشكل مخاطر أمنية: قد تكشف قيمة محسوبة بيانات لا يحق للمستخدم رؤيتها. استخدم sudo() فقط بعد دراسة تبعات الأمان بعناية.


التوقّع بإعادة حساب فورية في كل السياقات

في العمليات التفاعلية تكون إعادة الحساب عادة متزامنة، لكن في الاستيراد بالجملة أو الوظائف الخلفية أو بعض عمليات ORM قد يُؤجل أودو إعادة الحساب. لا تبنِ منطق أعمال يفترض تحديث القيمة المخزنة فورًا دائمًا؛ تحقّق من السلوك في السياق الذي سيُستخدم فيه الحقل.

خلاصة


الحقول المحسوبة المخزنة تُعد أداة قوية عند بناء أو توسيع نظام أودو: تؤتمت الحسابات، تحافظ على تناسق البيانات، وتجعل السجلات قابلة للبحث والتصدير بدون عبء يدوي.


نقاط أساسية لتتذكّرها:

  • استخدم store=True عندما تحتاج أن يكون الحقل قابلاً للبحث أو التصفية أو التصدير.
  • أعلن كل التبعيات في @api.depends()، بما في ذلك المسارات عبر النماذج المرتبطة.
  • اجعل دوال الحساب سريعة وتعامل مع حالات الحافة صراحةً.
  • للمعادلات البسيطة ستوديو خيار سريع؛ وللمنطق المعقّد اكتب بايثون.
  • خطط لإعادة الحساب الأولية عند النشر على جداول كبيرة.

سواء كنت تبني وحدة مخصصة جديدة أو توسّع نموذجًا موجودًا أو تتعرّف على أنواع الحقول في أودو للمرة الأولى، فهم الحقول المحسوبة المخزنة مهم لأنها تربط بين ORM وقاعدة البيانات ومنطق الأعمال.


هل تحتاج مساعدة في تنفيذ أودو؟

تقدم Dasolo خبرات تنفيذ وتخصيص وتحسين أودو لتلبية احتياجات أعمال متنوّعة. إن احتجت إضافة حقول محسوبة، بناء تقارير مبنية على قيم محسوبة، أو تطوير حلول متقدّمة، فريقنا جاهز لمساعدتك.


تواصل معنا لنتحدّث عن حالتك ونقترح الحل الأنسب لنشاطك.

الحقول المحسوبة المخزنة في Odoo: الدليل الشامل
Dasolo 6 مارس 2026
شارك هذا المنشور
تسجيل الدخول حتى تترك تعليقاً