Introduktion
Binary-felter er måske ikke det mest spændende element i en Odoo-udrulning, men de er fundamentet bag mange daglige arbejdsgange. Hver gang en medarbejder uploader en underskrevet kontrakt, vedhæfter en produktspecifikation eller lægger firmalogoet på en kontakt, ligger der et Binary-felt og håndterer filen. At kende forskel på hvordan data gemmes, hvor de lander, og hvornår man bør vælge en anden felttype gør en stor forskel, når du designer formularer eller udvider modeller i Odoo.
Denne guide forklarer hvad Binary-feltet indeholder, hvordan attach-mode påvirker lagring og ydeevne, hvordan du opretter og tilpasser feltet via Odoo Studio eller Python, samt praktiske eksempler fra CRM, HR, lager og andre afdelinger.
Hvad er Binary-feltet i Odoo
I Odoo's ORM repræsenterer fields.Binary rå binære data: dokumenter, billeder eller enhver filtype brugeren knytter til en post. For slutbrugeren viser det sig som en upload-knap i en formular. Når filen er lagt på posten, bruges samme kontrol til at downloade filen med et enkelt klik.
Det vigtigste tekniske punkt er hvor filens indhold gemmes. I moderne Odoo-udgaver benyttes som standard attachment-mode: filindholdet placeres i ir.attachment-tabellen og i serverens fillager, mens selve modelkolonnen kun indeholder en reference til vedhæftningen. Den strategi holder hovedtabeller små og giver Odoo mulighed for effektiv filhåndtering.
I Odoo Studio findes Binary-feltet under navnet File i feltvælgeren. I formularer viser det en simpel upload-/download-kontrol. Til billeder tilbyder Odoo også en specialiseret type fields.Image, som håndterer automatisk størrelsesbegrænsning og viser miniaturebilleder — det berører vi i relevante afsnit længere nede.
Sådan ser en Binary-definition typisk ud i en Python-model:
from odoo import fields, models
class ResPartner(models.Model):
_inherit = 'res.partner'
x_signed_contract = fields.Binary(
string='Signed Contract',
attachment=True,
)
x_signed_contract_filename = fields.Char(
string='Signed Contract Filename',
)
Bemærk det ledsagende x_signed_contract_filename Char-felt. Det er almindelig praksis at parre et Binary-felt med et _filename-felt, så Odoo kan huske og vise det oprindelige filnavn i brugerfladen. Uden det risikerer du, at downloadede filer får et generisk navn.
Sådan fungerer feltet
Når du tilføjer et Binary-felt i datamodellen, håndterer rammeværket oprettelsen af kolonnen automatisk ved installation eller opgradering af modulet. Du behøver ikke lave manuel SQL.
Lagringsmåder
Faktoren attachment på et Binary-felt bestemmer, hvor filbytes faktisk gemmes:
- attachment=True (anbefalet): Filindhold gemmes i
ir.attachmentog er linket til posten via modelnavn og record ID. Modelkolonnen indeholder kun en reference. Denne løsning holder modeltabellerne smalle og udnytter Odoo's filsystem effektivt. - attachment=False: De rå base64-kodede data gemmes direkte i modelens kolonne. Det får tabeller til at vokse hurtigt og kan gøre forespørgsler langsommere. Undgå denne måde til andet end meget små thumbnails.
Dataformat
Binary-felter håndterer data som base64-kodede strenge. Når du læser et Binary-felt gennem ORM eller XML-RPC, får du en base64-streng; når du skriver, skal du levere en base64-streng.
I praksis betyder det: kod filen ved skrivning og afkod ved læsning.
import base64
# Skrive en fil til et Binary-felt
with open('document.pdf', 'rb') as f:
encoded = base64.b64encode(f.read()).decode('utf-8')
record.write({'x_signed_contract': encoded})
# Læse en fil fra et Binary-felt
raw_bytes = base64.b64decode(record.x_signed_contract)
Vigtige feltattributter
Her er de mest brugte attributter til et Binary-felt i Odoo:
- attachment: Boolesk. Bestemmer om filen gemmes i
ir.attachment(True) eller direkte i kolonnen (False). Standard: True i nyere Odoo-udgaver. - string: Den label, der vises i brugerfladen.
- required: Gør feltet obligatorisk før posten kan gemmes.
- compute: Peger på en Python-metode, som kan generere feltets indhold dynamisk, f.eks. generere en PDF on-the-fly.
- store: Ved brug sammen med
computegemmes den beregnede værdi i databasen. - groups: Begrænser adgang til feltet til udvalgte brugergrupper. Vigtigt for fortrolige dokumenter.
- copy: Styrer om værdien kopieres ved duplikering af posten. Standardværdier afhænger af attachment-mode og Odoo-version.
fields.Image-subklassen
fields.Image er en specialiseret variant af Binary-feltet, introduceret i Odoo 13. Den tilføjer automatisk billedskalering til en konfigurerbar maksimal dimension, understøtter miniaturevisning og viser billedpreview i formularer. Til produktbilleder, partnerfotos eller logos er fields.Image ofte det korrekte valg — det forhindrer uhensigtsmæssigt store uploads og giver en bedre brugeroplevelse.
Hvordan det viser sig i visninger
I formularvisninger præsenteres Binary-feltet som en upload-/download-kontrol. For billeder bør du bruge image-widgeten for at få miniaturevisning. I listevisninger viser man normalt ikke selve Binary-feltet, da indlæsning af filindhold for alle rækker kan medføre unødvendig datatrafik; i stedet bruges en indikator eller ikon for at vise om en fil er vedhæftet.
Forretningssituationer hvor det bruges
Binary-feltet bruges i mange Odoo-moduler i konkrete kundescenarier. Her er fem typiske anvendelser fra forskellige forretningsområder.
CRM: Gemme underskrevne aftaler og NDA'er på kundeposter
Salgsafdelinger vil ofte have direkte adgang til underskrevne aftaler på kundens eller leadens post i CRM. Et Binary-felt på res.partner eller crm.lead giver sælgere et enkelt sted at finde kontrakter uden at forlade Odoo — praktisk når man vil undgå en separat dokumentstyringsløsning til basale behov.
HR: Medarbejderdokumenter
HR skal typisk opbevare ID-kopier, arbejdstilladelser, underskrevne ansættelseskontrakter eller kursusbeviser. Et Binary-felt på hr.employee gemmer disse filer inden for Odoo's rettighedsstyring. Med groups-attributten kan man sørge for, at kun HR-personale kan se sensitive dokumenter, mens andre ledere får adgang til posten uden filerne. Det er et almindeligt krav i virksomheder med stramme persondataregler.
Lager: Produktspecifikationer og sikkerhedsdatablade
Tekniske varer leveres ofte med PDF-specifikationer, sikkerhedsdatablade eller certifikater. Et Binary-felt på product.template gør det nemt for indkøb og lagerpersonale at finde dokumentationen direkte på produktposten. Det er en hyppig tilpasning i produktions- og distributionsvirksomheder og kan implementeres hurtigt med enten Studio eller et custom modul.
Salg: Firmastempel eller autoriseret signatur til trykte tilbud
Nogle virksomheder har brug for at få firmastempel eller signatur med på trykte tilbud og ordrebekræftelser. Et fields.Image-felt på res.company gemmer denne grafiske ressource, som efterfølgende kan indsættes i QWeb-rapporter. Det automatiserer processen og reducerer risikoen for at sende ikke-undertegnede tilbud.
Bogføring: Scannet kvittering på udgiftsbilag
Udgiftsprocesser kræver ofte vedhæftede kvitteringer eller fakturaer som dokumentation. Standard Odoo håndterer dette via vedhæftningssystemet, men i tilpassede udgiftsmodeller eller ved integrationer er et Binary-felt en ren løsning til at gemme PDF'er eller billedfiler direkte på postens rekord og indbygge dem i godkendelsesflowet.
Oprette eller tilpasse Binary-feltet
Tre hovedmetoder til at tilføje et Binary-felt til en model findes, afhængig af hvor meget kontrol og sporbarhed du har brug for.
Brug Odoo Studio (ingen kode)
Odoo Studio er et lavkodeværktøj, som gør det let at tilføje filer uden programmering:
- Åbn Odoo Studio fra hovedmenuen.
- Gå til den formular, hvor feltet skal være.
- Træk et File-felt ind på formularen fra feltvælgeren.
- Angiv label og eventuelle synlighedsregler i egenskabspanelet.
- Gem og luk Studio.
Studio opretter feltet med et x_studio_-præfiks og bruger attachment-mode automatisk. Ingen databaseopsætning kræves fra din side — en hurtig og tilgængelig løsning for forretningsbrugere, som vil have upload-funktionalitet uden udviklerhjælp.
Brug Python i et custom modul
Når du arbejder med versionsstyring og deployment på tværs af miljøer, er det bedste at definere Binary-felter i Python-modulet. Det er den anbefalede metode til seriøse tilpasninger:
from odoo import fields, models
class HrEmployee(models.Model):
_inherit = 'hr.employee'
x_id_document = fields.Binary(
string='ID Document',
attachment=True,
groups='hr.group_hr_user',
)
x_id_document_filename = fields.Char(
string='ID Document Filename',
)
Efter at have defineret feltet, tilføj det i formularvisningen med binary-widget og filename-attribut pegende på det tilhørende Char-felt. Odoo sørger for databasekolonnen ved installation eller opgradering. Metoden fungerer konsistent på Odoo.sh og on-premise installeringer.
Brug XML-RPC API'en
Hvis du opretter felter programmatisk fra eksterne scripts eller automatiserede deployments, kan du oprette Binary-felter via XML-RPC:
field_id = models.execute_kw(
ODOO_DB, uid, ODOO_API_KEY,
'ir.model.fields', 'create',
[{
'name': 'x_custom_document',
'field_description': 'Custom Document',
'model_id': model_id,
'ttype': 'binary',
'state': 'manual',
}]
)
Værdien state: manual markerer at feltet er oprettet manuelt og ikke via et installeret modul. Felter oprettet via API bruger som regel attachment-mode som standard i nyere Odoo-versioner — praktisk i automatiserede konfigurationsflows.
Best practices
1. Brug altid attachment=True
Medmindre du har en særdeles god grund til andet, bør filindhold gemmes i vedhæftningssystemet. Det holder model-tabeller små, undgår langsomme forespørgsler og udnytter Odoo's filhåndtering. For alt, der er større end en lille thumbnail, er attachment-mode nødvendigt.
2. Par Binary-felter med et filename Char-felt
Tilføj altid et _filename Char-felt ved siden af Binary-feltet. Uden det mister upload-widgetten evnen til at vise det oprindelige filnavn, og brugere får downloadfiler med generiske navne som download. Den lille ekstra linje kode forbedrer brugeroplevelsen markant.
3. Brug fields.Image til billedindhold
Ved produktbilleder, portrætter eller logoer er fields.Image det rigtige valg. Den begrænser uploadstørrelse, genererer thumbnails og optimerer brugeroplevelsen — vælg altid felttypen efter forventet indhold.
4. Begræns adgang med groups-parameteren
Sensitive dokumenter bør være låst bag brugergrupper. Brug groups-attributten til at styre læse- og skriverettigheder — vigtigt for persondata og revisionsspor i regulerede virksomheder.
5. Håndter base64-kodning korrekt i kode
Når du læser eller skriver Binary-felter programmatisk, skal du eksplicit håndtere base64: brug base64.b64encode(file_bytes).decode('utf-8') ved skrivning og base64.b64decode(field_value) ved læsning. Mange fejl i integrationer stammer fra forkerte antagelser om formatet.
Almindelige faldgruber
Konsekvenser af attachment=False for store filer
At lagre filer direkte i en databasekolonne kan hurtigt få PostgreSQL-tabeller til at vokse. Et par dusin PDF'er med attachment=False kan tilføje hundreder af megabyte til en enkelt tabel og sænke alle forespørgsler på modellen. At rette dette kræver ofte et skræddersyet migrationsscript og omhyggelig planlægning.
At glemme filnavnsfeltet
Uden det tilhørende Char-felt ender brugere med generiske filnavne ved download — en lille, men mærkbar brugeroplevelsesbrist. Tilføj filnavnsfeltet: det tager næsten ingen tid og ser professionelt ud i brugerfladen.
Forveksling af Binary og Image
At bruge en plain Binary til billeder betyder, at du ikke får automatisk skalering eller thumbnails, og brugere kan uploade store billeder, som gør sider langsommere. Omvendt vil fields.Image give fejl, hvis du forsøger at gemme en PDF. Kort sagt: match felttype og indhold.
Inkludere Binary-felter i listevisninger
Hvis du placerer et Binary-felt i en listevisning, forsøger Odoo at hente filindholdet for hver række — for mange rækker betyder megabytes dataoverførsel ved hver sidevisning. Vis i stedet en beregnet boolean eller et ikon for at indikere vedhæftninger.
Manglende kontrol for False før behandling i kode
Et tomt Binary-felt returnerer False i Python, ikke en tom streng. Forsøger du at dekode uden at tjekke, får du en TypeError. Guard altid: if record.x_document: data = base64.b64decode(record.x_document) — især i compute-metoder og serveractions.
Konklusion
Binary-feltet er simpelt, men centralt i Odoo's datamodel. Det sørger for at filer og dokumenter opbevares sammen med posterne, integreret med Odoo's vedhæftningssystem og adgangskontrol.
De vigtigste vaner er: brug attachment-mode, par binary med et filename-felt, vælg fields.Image til billeder, begræns adgang til sensitive filer, og håndter base64 eksplicit i kode. Følger du disse retningslinjer undgår du de mest almindelige problemer i produktion.
Uanset om du tilføjer feltet via Odoo Studio, bygger et Python-modul eller styrer felter gennem ORM/XML-RPC, giver korrekt håndtering af Binary-felter et renere og mere stabilt Odoo-miljø fra starten.
Hos Dasolo hjælper vi virksomheder med at implementere, tilpasse og optimere Odoo på tværs af afdelinger. Om du har brug for rådgivning om datamodeldesign, skræddersyede filarbejdsgange eller udvikling af et komplet modul, står vores team klar til at hjælpe. Kontakt os og lad os tage en snak om dit Odoo-projekt.