You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在Odoo的student模型中直接添加指定字段验证规则?

Implementing Field Validation in Your Odoo Student Model

Absolutely! You can enforce these exact validation rules directly in your Odoo model using constraints—either Python constraints (for application-level checks with user-friendly feedback) or SQL constraints (for database-level safeguards). Here's how to set both up for your Student model:

1. Validating the name Field

Your name needs to be 10-15 characters long, containing only letters (a-z, A-Z) and spaces. A Python constraint is perfect here because it lets you add clear error messages and check character types easily.

Add this method to your model:

from odoo import models, fields, api
from odoo.exceptions import ValidationError

class Student(models.Model):
    _name = "student"
    
    name = fields.Char(string='Name', required=True)
    nid = fields.Char(string='NID', required=True)

    @api.constrains('name')
    def _check_name_format(self):
        for record in self:
            # Check length is between 10 and 15
            if not (10 <= len(record.name) <= 15):
                raise ValidationError("Name must be between 10 and 15 characters long.")
            # Check only letters and spaces are present
            if not record.name.replace(' ', '').isalpha():
                raise ValidationError("Name can only contain letters and spaces.")

2. Validating the nid Field

Your nid requires a format like A123456789012B (uppercase letter + 12 digits + uppercase letter). You can use a regular expression for this, and implement it either via Python or SQL constraint.

Option 1: Python Constraint (User-Friendly Feedback)

Add this method alongside the name validation:

@api.constrains('nid')
    def _check_nid_format(self):
        import re
        nid_pattern = r'^[A-Z]\d{12}[A-Z]$'
        for record in self:
            if not re.match(nid_pattern, record.nid):
                raise ValidationError("NID must start with an uppercase letter, followed by 12 digits, and end with an uppercase letter (e.g., A123456789012B).")

Option 2: SQL Constraint (Database-Level Safeguard)

If you want to enforce the rule at the database level (to prevent invalid data from being inserted even outside the Odoo interface), add an SQL constraint:

_sql_constraints = [
        ('nid_format_check', 'CHECK (nid ~ \'^[A-Z][0-9]{12}[A-Z]$\')', 'NID must follow the format: Uppercase letter + 12 digits + Uppercase letter.'),
    ]

Note: This uses PostgreSQL's regex operator ~, which works because Odoo uses PostgreSQL by default.

Full Model Code

Putting it all together (using both Python constraints for feedback and SQL constraint for extra safety):

from odoo import models, fields, api
from odoo.exceptions import ValidationError
import re

class Student(models.Model):
    _name = "student"
    
    name = fields.Char(string='Name', required=True)
    nid = fields.Char(string='NID', required=True)

    # Python constraint for name field
    @api.constrains('name')
    def _check_name_format(self):
        for record in self:
            if not (10 <= len(record.name) <= 15):
                raise ValidationError("Name must be between 10 and 15 characters long.")
            if not record.name.replace(' ', '').isalpha():
                raise ValidationError("Name can only contain letters and spaces.")

    # Python constraint for NID field
    @api.constrains('nid')
    def _check_nid_format(self):
        nid_pattern = r'^[A-Z]\d{12}[A-Z]$'
        for record in self:
            if not re.match(nid_pattern, record.nid):
                raise ValidationError("NID must start with an uppercase letter, followed by 12 digits, and end with an uppercase letter (e.g., A123456789012B).")

    # SQL constraint for NID (extra database-level check)
    _sql_constraints = [
        ('nid_format_check', 'CHECK (nid ~ \'^[A-Z][0-9]{12}[A-Z]$\')', 'NID must follow the format: Uppercase letter + 12 digits + Uppercase letter.'),
    ]

How It Works

  • Python Constraints: Triggered when saving the record (or when the field is modified in the form), and throw a ValidationError with a clear message that users see immediately.
  • SQL Constraints: Enforced directly by the database, so even if someone modifies data via SQL queries (bypassing Odoo), the invalid data will be rejected.

You can pick whichever combination fits your needs—Python constraints are great for user experience, while SQL constraints add an extra layer of data integrity.

内容的提问来源于stack exchange,提问作者Mingg Lex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:11:35