models
Models benutzen python um die PostgreSQL Datenbank zu manipulieren. Es können Tabellen und Felder angelegt werden ohne eine Zeile SQL schreiben zu müssen. Dafür ist das ORM(Object Relational Model) zuständig. Laut Odoo development Guidlines sollen models im Unterverzeichnis models des Moduls gespeichert sein.
Tabellen
In odoo werden python Klassen zu SQL Tabellen. Hierzu muss die Klasse von models.Model erben, dies ist eine Vorlage für die Übersetzung von python zu SQL.
from odoo import models class neueTabelle(models.Model):
Diese Tabelle würde keine Spalten außer denen die Odoo standardmäßig anlegt.
Um eigene Felder anzulegen überlegt man sich von welchem Typ das Feld seien soll. Möchte man Beispielsweise eine Adresse speichern so wählt man den Typ Char, da dieser sowohl Buchstaben als auch Zahlen darstellen kann.
from odoo import models, fields class neueTabelle(models.Model): adresse = fields.Char()
Andere Typen wären:
- fields.Char() - Text mit bis zu 255 Zeichen
- fields.Integer() - ganze Zahl
- fields.Float() - Kommazahlen(64 bit länge)
- fields.Text() - Textfeld mit bis zu 65535 Zeichen
- fields.Binary() - für binäre Daten wie Bilder
- fields.DateTime() - python DateTime Objekt
Es gibt Feldtypen die Beziehungen zwischen Tabellen herstellen können.
- fields.Many2one - Beziehung zu einem Eintrag in der anderen Tabelle(n zu 1 Beziehung im ER-Modell)
- fields.One2many - Beziehung zu allen Einträgen in der anderen Tabelle(1 zu n Beziehung im ER-Modell)
- fields.Many2many - Alle Felder einer Tabelle beziehen sich auf alle Felder der anderen Tabelle(n zu m Beziehung im ER-Modell)
Ein model benötigt auch einen Namen. Der übergebene String wird dann zum Namen der Tabelle in der Datenbank. Allerdings werden alle . durch _ ersetzt. Der Modulname sollte jedem model vorrangehen, um Tabellen und deren Namensräume zu trennen.
from odoo import models, fields class neueTabelle(models.Model): _name = 'Modulname.neueTabelle' adresse = fields.Char()
_name
Name der Tabelle in der Datenbank.(Es werden Punkte benutzt um Namensräume zu trennen) Beispiel:
_name = 'requiremnet.line'
Ebenfalls können bereits vorhandene models erweitert werden. Hierzu muss das, zu erweiternde, model gerbt werden.
from odoo import models, fields class neueTabelle(models.Model): _name = 'Modulname.neueTabelle' _inherit = 'sale.order.line' adresse = fields.Char()
_inherit
Erben von Feldern und Methoden eines anderen Modells.
_inherit = "sale.order.line"