RPC_ERROR Odoo Server Error Traceback (most recent...

Tạo vào: 15 tháng 9, 2025

Trả lời bằng GPT-5 bởi Chat01

Câu hỏi

RPC_ERROR
Odoo Server Error
Traceback (most recent call last):
File "/home/odoo/src/odoo/odoo/http.py", line 1848, in _serve_db
return service_model.retrying(self._serve_ir_http, self.env)
File "/home/odoo/src/odoo/odoo/service/model.py", line 152, in retrying
result = func()
File "/home/odoo/src/odoo/odoo/http.py", line 1876, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
File "/home/odoo/src/odoo/odoo/http.py", line 2080, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
File "/home/odoo/src/odoo/addons/website/models/ir_http.py", line 237, in _dispatch
response = super()._dispatch(endpoint)
File "/home/odoo/src/odoo/odoo/addons/base/models/ir_http.py", line 154, in _dispatch
result = endpoint(**request.params)
File "/home/odoo/src/odoo/odoo/http.py", line 763, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "/home/odoo/src/odoo/addons/web/controllers/dataset.py", line 47, in call_button
action = self._call_kw(model, method, args, kwargs)
File "/home/odoo/src/odoo/addons/web/controllers/dataset.py", line 34, in _call_kw
return call_kw(Model, method, args, kwargs)
File "/home/odoo/src/odoo/odoo/api.py", line 484, in call_kw
result = _call_kw_multi(method, model, args, kwargs)
File "/home/odoo/src/odoo/odoo/api.py", line 469, in _call_kw_multi
result = method(recs, *args, **kwargs)
File "<decorator-gen-77>", line 2, in button_immediate_install
File "/home/odoo/src/odoo/odoo/addons/base/models/ir_module.py", line 74, in check_and_log
return method(self, *args, **kwargs)
File "/home/odoo/src/odoo/odoo/addons/base/models/ir_module.py", line 478, in button_immediate_install
return self._button_immediate_function(self.env.registry[self._name].button_install)
File "/home/odoo/src/odoo/odoo/addons/base/models/ir_module.py", line 602, in _button_immediate_function
registry = modules.registry.Registry.new(self._cr.dbname, update_module=True)
File "<decorator-gen-16>", line 2, in new
File "/home/odoo/src/odoo/odoo/tools/func.py", line 87, in locked
return func(inst, *args, **kwargs)
File "/home/odoo/src/odoo/odoo/modules/registry.py", line 87, in new
odoo.modules.load_modules(registry, force_demo, status, update_module)
File "/home/odoo/src/odoo/odoo/modules/loading.py", line 493, in load_modules
processed_modules += load_marked_modules(cr, graph,
File "/home/odoo/src/odoo/odoo/modules/loading.py", line 374, in load_marked_modules
loaded, processed = load_module_graph(
File "/home/odoo/src/odoo/odoo/modules/loading.py", line 190, in load_module_graph
load_openerp_module(package.name)
File "/home/odoo/src/odoo/odoo/modules/module.py", line 471, in load_openerp_module
import('odoo.addons.' + module_name)
File "/home/odoo/src/user/job_cost_trend/init.py", line 3, in <module>
from . import models
ImportError: cannot import name 'models' from partially initialized module 'odoo.addons.job_cost_trend' (most likely due to a circular import) (/home/odoo/src/user/job_cost_trend/init.py)

The above server error caused the following client error:
RPC_ERROR: Odoo Server Error
RPC_ERROR
at makeErrorFromResponse (https://pcco-testcons-23708883.dev.odoo.com/web/assets/30964-bae3cd4/web.assets_backend.min.js:1010:163)
at XMLHttpRequest.<anonymous> (https://pcco-testcons-23708883.dev.odoo.com/web/assets/30964-bae3cd4/web.assets_backend.min.js:1018:13)

Suy nghĩ

Debugging circular import

It seems the issue stems from a circular import in the custom module job_cost_trend. I’ll suggest steps to fix it: ensure correct module structure (use explicit imports in __init__.py), avoid improper relative imports, and check __manifest__.py for dependencies. I'll also recommend restarting the server, clearing .pyc files, and running pylint for diagnostics.

Fixing circular import issues

To solve this, first check the directory structure. If you have a models/ directory, ensure it includes a proper __init__.py file; don’t use a models.py file alongside it. In models/__init__.py, avoid doing from . import models in the individual models/*.py files. Instead, use direct imports like from odoo import models, fields, api.

Thought for 12s

Trả lời

Got it — that traceback means Python hit a circular import while loading your custom module job_cost_trend. In Odoo that almost always comes from how the package is laid out or from importing your own package inside your model files.

Here’s a quick, focused checklist to fix it fast.

1) Make sure your module layout is “boringly standard”

Use either a single models.py or a models/ package — not both.

Option A: single file

text
job_cost_trend/ ├─ __init__.py ├─ __manifest__.py ├─ models.py └─ views/...

__init__.py:

python
# job_cost_trend/__init__.py from . import models # refers to models.py

Option B: package of model files

text
job_cost_trend/ ├─ __init__.py ├─ __manifest__.py ├─ models/ │ ├─ __init__.py │ ├─ job_cost.py │ └─ trend.py └─ views/...

__init__.py:

python
# job_cost_trend/__init__.py from . import models

models/__init__.py:

python
# job_cost_trend/models/__init__.py from . import job_cost from . import trend

📌 If you currently have both a models.py file and a models/ folder, pick one pattern and delete/rename the other (this collision can trigger confusing import behavior).

2) Never import your own addon package inside model files

Inside files like job_cost.py or models.py, you should not do:

python
from odoo.addons.job_cost_trend import models # ❌ causes circular import

Use Odoo’s base classes directly:

python
from odoo import models, fields, api, _

Circular imports often happen when a file tries to import odoo.addons.job_cost_trend (which is still initializing), while __init__.py is importing that file.

3) Keep __init__.py imports simple

Top-level __init__.py should only import the top-level packages (e.g., models, controllers, wizards). Don’t import specific model classes there; that’s what models/__init__.py is for.

Good:

python
# job_cost_trend/__init__.py from . import models

Avoid:

python
# ❌ importing specific modules from deeper paths here from .models import job_cost, trend

4) Check for cross-file circulars

Look for patterns like:

  • models/job_cost.py imports something from models/trend.py
  • and models/trend.py imports something back from models/job_cost.py

If you genuinely need cross-references, prefer lazy lookups via the environment instead of importing each other:

python
other_model = self.env['job.cost.trend'] # ✅ no Python-level import

5) Name collisions with Python stdlib or Odoo modules

Ensure none of your files use names that clash with stdlib or Odoo core modules (e.g., avoid naming a file types.py, logging.py, fields.py, etc.).

6) Minimal working example to test

Create the smallest possible models.py to verify imports:

python
# job_cost_trend/models.py (or models/job_cost.py) from odoo import models, fields class JobCostTrend(models.Model): _name = 'job.cost.trend' _description = 'Job Cost Trend' name = fields.Char(required=True)

If this loads, the skeleton is fine; then reintroduce other files step by step.

7) Clean & update after changes

After you fix the structure/imports:

  • Clear compiled files:
    find /home/odoo/src/user/job_cost_trend -name "*.pyc" -delete -o -name "__pycache__" -type d -exec rm -rf {} +
    
  • Restart Odoo and update the module:
    odoo-bin -d <your_db> -u job_cost_trend
    

8) Common “gotchas” that trigger this exact error

  • A models/__init__.py that does from .. import models (wrong). It should import sibling files only (from . import foo).
  • Importing your own addon from views, wizards, or controllers at import time (e.g., a controller importing a model which imports the package).
  • Accidentally having a directory named models and a file named models.py.

If you paste your current tree (just the file/folder names) and the top ~10 lines of job_cost_trend/__init__.py and models/__init__.py (or models.py), I can point to the exact line to change.

Câu hỏi

ممكن الشرح عربي

Trả lời

تمام ✅
المشكلة اللي ظهرت لك في Odoo هي خطأ "circular import" أو "استيراد دائري"، يعني فيه ملف يستدعي ملف ثاني، وهذا الملف الثاني يرجع يستدعي الأول → فيصير Python يحتار وما يقدر يكمّل التحميل.

خليني أشرح لك خطوة بخطوة بالعربي:


1) هيكل الموديول (Structure)

موديول Odoo لازم يكون منظم بشكل واضح. عندك خيارين فقط:

الخيار A: ملف واحد models.py

text
job_cost_trend/ ├─ __init__.py ├─ __manifest__.py ├─ models.py └─ views/...

وفي __init__.py:

python
from . import models

الخيار B: مجلد models/ فيه عدة ملفات

text
job_cost_trend/ ├─ __init__.py ├─ __manifest__.py ├─ models/ │ ├─ __init__.py │ ├─ job_cost.py │ └─ trend.py └─ views/...

وفي __init__.py:

python
from . import models

وفي models/__init__.py:

python
from . import job_cost from . import trend

🚨 إذا عندك ملف اسمه models.py ومجلد اسمه models/ بنفس الوقت → هذا يسبب المشكلة. لازم تختار واحد منهم فقط.


2) طريقة الاستيراد داخل الملفات

داخل أي ملف model (زي job_cost.py أو models.py) لازم تكتب:

python
from odoo import models, fields, api, _

❌ لا تكتب:

python
from odoo.addons.job_cost_trend import models

لأن هذا يسبب الاستيراد الدائري.


3) لا تكثر الاستدعاءات في __init__.py

الـ __init__.py في جذر الموديول يكفي يكون:

python
from . import models

وما يحتاج تذكر أسماء الملفات الفردية (خليها في models/__init__.py فقط).


4) الاستدعاءات بين الملفات

لو عندك ملفين يعتمدوا على بعض:

  • job_cost.py يستورد من trend.py
  • و trend.py يستورد من job_cost.py

هذا يعمل دورة (circular import). الحل: لا تستورد الملف الثاني مباشرة، بل استخدم self.env للوصول للموديل:

python
other_model = self.env['job.cost.trend']

5) خطوات الحل

  1. نظّف هيكل الموديول: اختر إما models.py أو models/ (مش الاثنين).
  2. عدّل __init__.py بحيث يكون بسيط.
  3. غيّر أي استيراد من odoo.addons.job_cost_trend إلى from odoo import ....
  4. امسح الملفات المترجمة القديمة:
    find /home/odoo/src/user/job_cost_trend -name "*.pyc" -delete -o -name "__pycache__" -type d -exec rm -rf {} +
    
  5. أعد تشغيل Odoo، ثم حدث الموديول:
    odoo-bin -d اسم_القاعدة -u job_cost_trend
    

تحب تكتب لي محتويات ملف job_cost_trend/__init__.py وأسماء الملفات اللي داخل مجلد models/ (أو ملف models.py
عشان أقولك بالضبط السطر اللي لازم يتغير.

Chia sẻ Q&A này