Как предотвратить создание дублированного поля в odoo? - PullRequest
0 голосов
/ 12 февраля 2020

Я создаю метод _sql_constraints в Odoo 12, чтобы сделать имя продукта, который является вычисляемым полем, уникальным, и я не получил никакой проверки для дублированных имен?

вот код

from odoo import api, fields, models, _
from odoo.exceptions import UserError, Warning, ValidationError
from statistics import mean
class autopart(models.Model):

_inherit = 'product.template'


@api.multi
@api.depends('item','dsc', 'drc', 'org','car','model', 'manf','year')
def naming(self):
    for rec in self:
        if rec.year:
            rec.name = " ".join(
                [rec.item or "", rec.drc or "", rec.dsc or "",
                 rec.org or "", rec.manf or "", rec.car or "",
                 rec.model or "", rec.year or ""
                 ])
        else:
            rec.name = " ".join(
                [rec.item and rec.item or "", rec.drc and rec.drc or "", rec.dsc and rec.dsc or "",
                 rec.org and rec.org or "", rec.manf and rec.manf or "", rec.car and rec.car or "",
                 rec.model or "",
                 ])

_sql_constraints = [
     ('model', 'unique(model)', ' model must be unique'),]

name = fields.Char(string="Name", compute=naming, store=True, required=True,)
item = fields.Char( store=True, string="Item", ondelete='restrict', required=False, )
dsc = fields.Char(store=True, string="Description", ondelete='restrict', required=False)
drc = fields.Char(store=True, string="Direction", ondelete='restrict', required=False)
org = fields.Char(store=True, string="Origin", ondelete='restrict', required=True)
manf = fields.Char(store=True, string="Origin manufacture", ondelete='restrict', required=False)
car = fields.Char(store=True, string="Car", ondelete='restrict', required=False,)
year = fields.Char(store=True, string="Year", required=False, ondelete='restrict')
model = fields.Char(string="Model", ondelete='restrict', required=True,  default='')

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Попробуйте изменить с этим, Вы хотите, чтобы название продукта было уникальным для этого, проверьте _sql_constraints и проверьте также объявление поля с помощью compute .

_sql_constraints = [
('name_uniq', 'unique (name)', "Name already exists !"),
]

name = fields.Char (string = "Name", compute = "naming", store = True, обязательно = True,)

Спасибо

0 голосов
/ 13 февраля 2020

Если в базе данных есть дублированные продукты, следующее ограничение не будет работать из-за psycopg2.IntegrityError.

_sql_constraints = [
     ('uniq_name', 'unique(name)', 'Name must be unique'),
]

Журнал :

ERROR stackoverflow odoo.sql_db: bad query: ALTER TABLE "product_template" ADD CONSTRAINT "product_template_uniq_name" unique(name)  
ERROR: could not create unique index "product_template_uniq_name"  
DETAIL:  Key (name)=(   US   K360) is duplicated.

WARNING stackoverflow odoo.schema: Table 'product_template': unable to add constraint 'product_template_uniq_name'!
If you want to have it, you should update the records and execute manually:
ALTER TABLE "product_template" ADD CONSTRAINT "product_template_uniq_name" unique(name) 
Traceback (most recent call last):
  File "/home/odoo/odoo-12.0/odoo/tools/sql.py", line 138, in add_constraint
    cr.execute(query1)
  File "/home/odoo/odoo-12.0/odoo/sql_db.py", line 148, in wrapper
    return f(self, *args, **kwargs)
  File "/home/odoo/odoo-12.0/odoo/sql_db.py", line 225, in execute
    res = self._obj.execute(query, params)
psycopg2.IntegrityError: could not create unique index "product_template_uniq_name"
DETAIL:  Key (name)=(   US   K360) is duplicated.

Вместо этого можно использовать ограничения Python .

...