Los campos Introducción
Los
objetos pueden contener diferentes tipos de
campos. Esos
tipos se pueden dividir en tres categorĆas: los
tipos simples, tipos de relación y campos
funcionales. Los
tipos simples son enteros, reales, booleanos,
cadenas, etc ... ;
Los tipos de relación se utilizan para representar
relaciones entre objetos (one2one, one2many,
many2one). Campos
funcionales son campos especiales porque no se
almacenan en la base de datos pero calculan en
tiempo real dado otros campos de la vista.
AquĆ
estÔ la cabecera del método de inicialización de
cualquier campo de la clase definida en Odoo (OpenERP) (como se puede ver en el server / bin /
OSV / fields.py):
Hay un
conjunto común de parÔmetros opcionales que estÔn
disponibles para la mayorĆa de los tipos de
campos:
change_default: | Ya sea o no el usuario puede definir valores por defecto en otros campos en función del valor de este campo. Estos valores por defecto deben ser definidos en la tabla ir.values. |
---|---|
help: | Una descripción de cómo se debe utilizar el campo: mÔs y mÔs descriptivo que char . AparecerÔ en la información sobre herramientas cuando se pasa el ratón sobre el campo. |
ondelete: | Cómo manejar las eliminaciones en un registro relacionado. Por default encontraremos el valor "ondelete". |
priority: | No se utiliza? |
readonly: | True si el usuario no puede editar este campo, de lo contrario False . |
required: | True si el campo debe tener un valor antes de que el objeto puede ser salvado, de lo contrario False . |
size: | El tamaƱo del campo en la base de datos: nĆŗmero de caracteres o dĆgitos. Para los campos de tipo Char. |
states: | Permite anular otros parĆ”metros para los estados especĆficos de este objeto. Acepta un diccionario con los nombres de los estados como claves y una lista de nombres / valores tuplas como los valores. Por ejemplo: states = {'done': [('readonly', True)]} |
char: | El nombre del campo como debe aparecer en una etiqueta o encabezado de la columna. Cadenas que contienen caracteres no ASCII deben utilizar objetos unicode de Python. Por ejemplo: 'test': fields.boolean (u'TestƩ ') |
translate: | True si el contenido de este campo debe ser traducido, de lo contrario False . |
TambiƩn hay
algunos parĆ”metros opcionales que son especĆficos
para algunos tipos de campos:
domain: |
Restricción
de dominio en un campo relacional.
Valor
por defecto: [].
Ejemplo:
domain = [('campo', '=', valor)])
|
---|---|
invisible: |
Ocultar el
valor del campo en los formularios. Por
ejemplo, una contraseƱa.
|
on_change: |
El valor por
defecto para el on_change atributo
en la vista. Esto
abrirÔ una función en el servidor cuando
los cambios en el campo en el cliente. Por
ejemplo, on_change
= "onchange_shop_id (shop_id)" .
|
related: |
Se utiliza
cuando un campo es una referencia a otra
tabla mediante su id. Este
es el nombre de la tabla para buscar el valor del campo. Por lo general se utiliza con los tipos de
campos relacionados y función.
|
selection: |
El
valor por defecto para la selección de
atributos en la vista. 1
significa búsqueda bÔsica y 2 medios de
bĆŗsqueda avanzada.
|
Tipo de Campos
Tipos bƔsicos
booleano: |
Un
booleano (true, false).
Sintaxis:
|
---|---|
integer: |
Un entero.
Sintaxis:
|
float: |
Un nĆŗmero
de punto flotante.
Sintaxis:
Nota
Los
dĆgitos parĆ”metro opcional define la
precisión y la escala del número. La
escala es el nĆŗmero de dĆgitos despuĆ©s
del punto decimal, mientras que la
precisión es el número total de
dĆgitos significativos en el nĆŗmero
(antes y despuƩs del punto decimal). Si
los dĆgitos parĆ”metro no estĆ”
presente, el nĆŗmero serĆ” un nĆŗmero de
punto flotante de doble precisión. Advertencia:
estos nĆŗmeros en coma flotante son
inexactas (no cualquier valor puede
ser convertido a su representación
binaria) y esto puede dar lugar a
errores de redondeo. Siempre
se debe utilizar el parĆ”metro dĆgitos
para cantidades monetarias.
Ejemplo:
|
char: |
Una cadena
de longitud limitada. El
parƔmetro tamaƱo requerido determina su
tamaƱo.
Sintaxis:
Ejemplo:
|
text: |
Un campo
de texto sin lĆmite de longitud.
Sintaxis:
|
date: |
A la
fecha.
Sintaxis:
|
datetime: |
Permite
almacenar la fecha y la hora del dĆa en
el mismo campo.
Sintaxis:
|
binary: |
Una cadena
binaria
|
selection: |
Un campo
que permite al usuario hacer una
selección entre varios valores
predefinidos.
Sintaxis:
Nota
Formato
del parÔmetro de selección: tupla de
tuplas de cadenas de la forma:
Nota
Usted
puede especificar la función que
devolverĆ” la tupla. Ejemplo
Ejemplo
El
uso de campos de relación many2one con la
selección . En
los campos de definiciones agregan:
Y
luego definir el _sel_func asĆ (pero
antes de las definiciones campos):
|
Tipos relacionales
one2one: |
Un campo
one2one expresa un uno: a: una relación
entre dos objetos. Se
ha quedado en desuso. Utilice
many2one lugar.
Sintaxis:
|
---|---|
many2one: |
Associates
este objeto a un objeto primario a
travƩs de este campo. Por
ejemplo, un empleado del Departamento
pertenece harĆa muchos a uno. es
decir, muchos empleados pertenecen a un
departamento
Sintaxis:
ParƔmetros
opcionales:
Ejemplo
|
one2many: |
TODO
Sintaxis:
Ejemplo
|
many2many: |
TODO
Sintaxis:
Ejemplo:
Para
que sea bidireccional (= crear un campo
en el otro objeto):
Ejemplo:
|
related: |
A veces es
necesario hacer referencia a la relación
de una relación. Por
ejemplo, supongamos que usted tiene
objetos: Ciudad -> Estado -> PaĆs,
y tiene que referirse al paĆs de una
ciudad, se puede definir un campo de la
siguiente manera en el objeto City:
|
Los campos funcionales
Un campo
funcional es un campo cuyo valor se calcula por
una función (en lugar de ser almacenado en la
base de datos).
ParƔmetros:
donde
- fnct es la función o el método que va a calcular el valor del campo. Debe de haber sido declarada antes de declarar el Ômbito funcional.
- fnct_inv es la función o método que le permitirÔ escribir valores en ese campo.
- tipo es el nombre del tipo de campo devuelto por la función. Puede ser cualquier nombre de tipo de campo, excepto la función.
- fnct_search le permite definir el comportamiento de bĆŗsqueda en ese campo.
- method si el campo se calcula mediante un método (de un objeto) o una función global
- almacenar Si desea almacenar campo en la base de datos o no. El valor predeterminado es False.
- multi es un nombre de grupo. Todos los campos con el mismo varios parÔmetros se calculan en una sola llamada de función.
fnct parƔmetro
Si el method es
cierto que la firma del mƩtodo debe ser:
de lo
contrario (si se trata de una función global),
su firma debe ser:
De
cualquier manera, debe devolver un diccionario
de valores de la forma {id'_1_
': value'_1_', id'_2_ ': value'_2_', ...}.
Los
valores del diccionario devuelto deben ser del
tipo especificado por el argumento de tipo en
la declaración del campo.
Si multi se ha
establecido, field_name se
sustituye por field_names : una
lista de los nombres de los campos que deben
ser calculados. Cada
valor en el diccionario devuelto es tambiƩn un
diccionario de nombre del campo de valor. Por
ejemplo, si los campos "Nombre" y "edad" estƔn
basados en la vital_statistics función,
el valor de retorno de vital_statistics podrĆa
tener este aspecto cuando ids es [1,
2, 5] :
parƔmetro fnct_inv
Si el mƩtodo es
cierto, la firma del mƩtodo debe ser:
de lo
contrario (si se trata de una función global),
que debe ser:
parƔmetro fnct_search
Si el
method es True, la firma del mƩtodo debe
ser:
de lo
contrario (si se trata de una función global),
que debe ser:
El valor
de retorno es una lista que contiene las
tuplas de 3 partes que se utilizan en función
de la bĆŗsqueda:
obj es el
mismo que 1
mismo , y el nombre recibe
el nombre de campo. args es una
lista de tuplas 3-parte que contiene criterios
de bĆŗsqueda para este campo, a pesar de la
función de búsqueda puede activarse por
separado para cada tupla.
Ejemplo
Supongamos
que creamos un objeto de contrato, que es:
Si
queremos aƱadir un campo que recupera la
función de un empleado por mirar de su
contrato actual, se utiliza un campo
funcional. El
hr_employee objeto se hereda de esta manera:
Nota
tres
puntos
- tipe = 'many2one' se debe a que el campo de la función debe crear un campo many2one; función se declara como many2one en hr_contract también.
- obj = "res.partner.function" se utiliza para indicar que el objeto que se utilizarĆ” para el campo many2one es res.partner.function.
- Llamamos a nuestro método _get_cur_function_id porque su función es devolver un diccionario cuyas claves son identificadores de los empleados, y cuyos valores correspondientes son los identificadores de la función de esos empleados. El código de este método es:
El
identificador de la función se recupera
mediante una consulta SQL. Tenga
en cuenta que si la consulta no devuelve
ningĆŗn resultado, el valor de sql_res
['id_función'] serÔ Ninguno. Nos
forzamos el valor False en este caso, ya que
el valor XML: RPC (comunicación entre el
servidor y el cliente) no permite transmitir
este valor.
ParƔmetro Store
Se
calcularĆ” el campo y almacenar el resultado en
la tabla. El
campo se vuelve a calcular cuando ciertos
campos se cambian en otros objetos. Se
utiliza la siguiente sintaxis:
Se
llamarÔ a la función nombre_funcion cuando los
cambios se escriben en los campos en la lista
['campo1', 'campo2'] en 'object_name' objeto.La
función debe tener la siguiente firma:
Cuando identificadores serƔn
los identificadores de registros de la tabla
del otro objeto que han cambiado los valores
en los campos observados.La
función debe devolver una lista de los
identificadores de los registros de su propia
tabla que debe tener el campo vuelve a
calcular. Dicha
lista se enviarƔ como un parƔmetro para la
función principal del campo.
He aquĆ
un ejemplo del módulo de afiliación:
Campos Property (Propiedad)
- Declarar una propiedad
Una
propiedad es un campo especial: fields.property.
Entonces
usted tiene que crear el valor por defecto en un
archivo XML para esta propiedad.:
Si el
valor por defecto apunta a un recurso de otro
módulo, puede usar la función de Ôrbitro de
esta manera:
<field
name="value"
eval="'product.pricelist,'+str(ref('module.data_id'))"/>
Property en Vistas Form.
Para
agregar propiedades en las formas, sólo hay que
poner la etiqueta <properties/> en su
formulario. Esto
agregarƔ automƔticamente todos los campos de
propiedades que estƔn relacionados con este
objeto. El
sistema agregarÔ propiedades en función de sus
derechos. (Algunas
personas serƔn capaces de cambiar una propiedad
especĆfica, otros no).
Las
propiedades se muestran en la sección,
dependiendo del atributo nombre_grupo. (Se
representa en el cliente como una etiqueta
separador).
¿Cómo
funciona esto?
La clase
fields.property hereda de fields.function y
reemplaza el mƩtodo de lectura y escritura. El
tipo de este campo es many2one, por lo que en la
forma de una propiedad se representa como una
función many2one.
Pero el
valor de una propiedad se almacena en la clase
ir.property / table como un registro completo. El
valor almacenado es un campo de referencia de
tipo (no many2one), ya que cada establecimiento
puede apuntar a un objeto diferente. Si
modifica los valores de las propiedades (en el
menú de administración), se representan como un
campo de referencia de tipo.
Cuando se
lee una propiedad, el programa le da la
propiedad asociado con la instancia de objeto
que estĆ” leyendo. Si
este objeto no tiene valor, el sistema le darĆ”
la propiedad predeterminada.
La
definición de una propiedad se almacena en la
clase ir.model.fields como cualquier otro campo. En
la definición de la propiedad, puede agregar
grupos que tienen permiso para cambiar a la
propiedad.
Utilización
de las propiedades o campos normales
Si desea
aƱadir una nueva caracterĆstica, tendrĆ” que
optar por aplicar como una propiedad o terreno
normal. Utilice
un campo normal cuando se hereda de un objeto y
quiere extender este objeto. Utilice
una propiedad cuando la nueva función no estÔ
relacionada con el objeto, sino a un concepto
externo.
AquĆ hay
algunos consejos para ayudarle a elegir entre un
campo normal o una propiedad:
Campos
normales ampliar el objeto, la adición de mÔs
caracterĆsticas o datos.
Una
propiedad es un concepto que se adjunta a un
objeto y tienen caracterĆsticas especiales:
- Valor diferente para la misma propiedad en función de la empresa
- La gestión de derechos por campo
- Es un vĆnculo entre los recursos (many2one)
Ejemplo
1: Cuentas por cobrar
La "Cuenta
por cobrar" por defecto de pareja se implementa
como una propiedad porque:
- Este es un concepto relacionado con la tabla de cuenta y no a la pareja, por lo que es una propiedad de cuenta de que es visible en una forma pareja. Derechos tienen que ser manejados en este campo para los contables, estos no son los mismos derechos que se aplican a los objetos asociados. AsĆ que usted tiene derechos especĆficos sólo para este campo de forma pareja: sólo los contadores pueden cambiar la cuenta por cobrar de un socio.
- Este es un campo multi-empresa: la misma pareja puede tener diferentes valores de cuentas por cobrar en función de la empresa que pertenece el usuario. En un sistema multi-empresa, hay una carta cuenta por la empresa. La cuenta por cobrar de una pareja depende de la empresa que realizó el pedido de venta.
- La cuenta por cobrar por defecto es el mismo para todos los socios y se configura desde el menú general de la propiedad (en la administración).
Nota
Una cosa
interesante es que las propiedades evitan
código "spaghetti". El
módulo cuenta depende del módulo pareja
(base). Pero
se puede instalar el módulo pareja (base) sin
el módulo de contabilidad. Si
agrega un campo que apunta a una cuenta en el
objeto de pareja, ambos objetos dependerƔn de
los demƔs. Es
mucho mĆ”s difĆcil de mantener y código (por
ejemplo, tratar de eliminar una tabla cuando
ambas tablas estƔn apuntando a los demƔs.)
Ejemplo
2: Tiempos de productos
El módulo
de caducidad del producto implementa todas las
demoras relacionadas con los productos: Fecha de
retiro, usetime producto, ... Este
módulo es muy útil para las industrias de
alimentos.
En este
módulo se hereda del objeto product.product y
aƱade nuevos campos a la misma:
Este
módulo agrega campos simples al objeto
product.product. No
usamos las propiedades debido a que:
- Extendemos un producto, el campo life_time es un concepto relacionado con un producto, no a otro objeto.
- No necesitamos una gestión correcta por campo, los diferentes retardos son gestionados por las mismas personas que manejan todos los productos.
GermĆ”n, cuidadĆn al traducir de forma automĆ”tica!!
ResponderBorrarComo pongas "cataratas" en lugar de "cascade" al definir un campo, ya verƔs que tortazo.
ParƔmetro "tienda", otra mƔs. Es "store" y punto.
Los campos de tipo propiedad no existen, son de tipo "property".
En fin, hay que darle un repaso :-)
Un saludo,
Juan