Tôi đã tìm ra điều này. Tôi phải nói rằng, về mặt kỹ thuật, điều này đủ điều kiện là một lỗi trong Odoo.
Tóm tắt
Tên các người mẫu của tôi quá dài. Mỗi khi bạn đặt _name
thuộc tính dài hơn 16 ký tự mà bạn đang tự thiết lập có thể gặp sự cố này.
Chi tiết
Khi bạn tạo một Many2many
quan hệ, odoo thiết lập một bảng cơ sở dữ liệu mới cho quan hệ này và sau đó tạo hai chỉ mục cơ sở dữ liệu cho bảng. Tên của họ như sau:
-
<model1>_<model2>_rel_<model1>_id_index
-
<model1>_<model2>_rel_<model2>_id_index
Ở đâu <model1>
và <model2>
là _name
tài sản của một mô hình thích hợp. Bạn có thể quan sát điều này trong _m2m_raise_or_create_relation
phương thức của BaseModel
của odoo .
Tuy nhiên, có một điều bắt được. Theo mặc định từ xác định trong PostgreSQL (bao gồm số nhận dạng chỉ mục) không được dài hơn 63 ký tự :
Odoo không tính đến điều này. Nó vui vẻ tạo ra các số nhận dạng dài hơn nhiều, sau đó được PostgreSQL cắt ngắn. Nếu cả hai số nhận dạng có cùng 63 ký tự đầu tiên (điều này rất có thể xảy ra đối với các số nhận dạng dài hơn) thì chúng sẽ được PostgreSQL coi là giống nhau. Điều đó có nghĩa là chỉ mục đầu tiên sẽ được tạo, nhưng việc tạo chỉ mục thứ hai sẽ dẫn đến lỗi, vì nó chia sẻ một số nhận dạng đã được sử dụng (ít nhất là theo PostgreSQL).
Vậy độ dài tối đa của _name
là bao nhiêu tài sản có thể có trong khi tránh vấn đề? Nó phụ thuộc vào số lượng ký tự được chia sẻ giữa tên của hai mô hình trong mối quan hệ m2m, nhưng để tránh hoàn toàn việc cắt ngắn số nhận dạng, bạn không nên sử dụng tên dài hơn 16 ký tự.
Tại sao lại là 16? Số nhận dạng PostgreSQL không được dài hơn 63 ký tự. Trong định danh chỉ mục do odoo tạo ra, có 15 ký tự cố định. Điều đó để lại cho chúng tôi 48 ký tự, phải đáp ứng ba lần lặp lại tên mô hình. Điều này lần lượt để lại cho chúng ta 16 ký tự cho mỗi tên kiểu máy.
Một cách khác để giải quyết vấn đề là đặt tên quan hệ ngắn theo cách thủ công thông qua quan hệ relation
thuộc tính trên Many2many
trường.