Skip to Content

Binary Field i Odoo: Den Ultimative Guide

En praktisk vejviser til Binær-feltet i Odoo: hvordan du gemmer filer og dokumenter, håndterer vedhæftninger og tilpasser teknikken bag kulisserne
6. marts 2026 af
Binary Field i Odoo: Den Ultimative Guide
Dasolo
| Ingen kommentarer endnu

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.attachment og 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 compute gemmes 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:

  1. Åbn Odoo Studio fra hovedmenuen.
  2. Gå til den formular, hvor feltet skal være.
  3. Træk et File-felt ind på formularen fra feltvælgeren.
  4. Angiv label og eventuelle synlighedsregler i egenskabspanelet.
  5. 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.

Binary Field i Odoo: Den Ultimative Guide
Dasolo 6. marts 2026
Del dette indlæg
Log ind for at skrive en kommentar

Læs næste indlæg
Standardværdier i Odoo-felter: Den komplette guide
Guide: Sådan udfylder du felter automatisk i Odoo — fra faste værdier til kontekstfølsomme standarder og beregnede værdier At få Odoo til at skrive i felter for dig sparer tid, mindsker fejl og gør brugeroplevelsen mere flydende. Her får du en praktisk introduktion til tre metoder: indsætte statiske værdier, bruge kontekst- eller brugerbaserede standarder og generere felter dynamisk via beregninger eller automatiske handlinger. Vi gennemgår, hvornår hver metode er bedst, hvilke Odoo-funktioner du bruger (som default_get, context, onchange, computed fields og automatiserede handlinger), og viser de typiske faldgruber, så du undgår uventede overskrivninger eller performance-problemer. Når du har brug for det simpleste: faste forudindstillinger Hvis et felt altid skal have samme startværdi — fx en standardkonto, en fast valuta eller en fast tekst — er det mest effektive at sætte en statisk standard. Det kan gøres i feltdefinitionen i modellen eller via standardværdier i brugergrænsefladen. Fordelene er enkle: stabilitet, lav kompleksitet og ingen runtime-beregninger. Ulempen er manglende fleksibilitet, så brug det kun for ægte “aldrig ændrer sig”-værdier. Kontekst og brugerdata: små tilpasninger uden kodning Vil du have forudfyldning, der tilpasser sig brugerens rolle, valgte selskab eller andre valg på formen? Brug kontekst (context) og default_get til at hente værdier baseret på session, aktuel bruger eller tidligere felter. Det er især nyttigt ved multi-company, når valuta eller journal skal afhænge af selskabet, eller når visse felter skal ændre sig for sælgere kontra regnskabsbrugere. Fordelen: dynamik uden at skrive avanceret logik; ulempe: det kan blive uoverskueligt, hvis for mange regler ligger skjult i konteksten. Onchange: reaktiv opførsel på formularniveau Onchange-metoder kører i browseren, når brugeren skifter et felt. Brug dem, når du vil opdatere felter øjeblikkeligt baseret på andre input (fx ændre leveringsdatoer, beregne priser eller vise/skjule felter). De påvirker kun formularen indtil gem — de skriver ikke nødvendigvis værdier i databasen. Det gør dem ideelle til UX-forbedringer, men pas på: tunge onchange-funktioner kan gøre formularen langsom. Computed fields: beregninger gemt eller ikke-gemt Når felter skal være resultatet af logik — fx totaler, rabatter eller statusberegninger — er computed fields løsningen. Du kan lave beregnede felter, der enten gemmes i databasen (store) eller kun beregnes on-the-fly. Gemte felter forbedrer søgbarhed og rapportering, mens ikke-gemte holder data konsistente uden ekstra lagring. Sørg for at erklære afhængigheder korrekt, så Odoo kun genberegner, når det er nødvendigt. Automatiserede handlinger og server-side logik For komplekse regler, der skal køre ved oprettelse, opdatering eller på baggrund af planlagte jobs, brug server-side kodestykker: create/write overrides, automatiserede server actions eller scheduled cron-jobs. Det er her, du håndterer integrationer, masseopdateringer eller betingelser, der ikke kan fanges i UI-laget. Fordelen er fuld kontrol; ulemperne er øget risiko for konflikter og behov for tests. Sikring mod overskrivning og prioritering af kilder Når flere mekanismer kan sætte samme felt, skal du afgøre prioriteringen: brugerinput bør normalt gå forud for automatiserede standarder. Implementér checks (fx kun skriv, hvis feltet er tomt) og informer brugeren, når automatiske værdier er sat. Test scenarier med både manuel udfyldelse og automatiske flows for at undgå utilsigtet data-tab. Best practices og performance-tips - Brug enkle regler nær kilden: foretræk kontekst eller default_get fremfor tunge server-kald i onchange. - Gem kun computed fields, hvis du har behov for søgning eller rapporter på feltet. - Begræns kompleks logik i onchange for at undgå langsomme formularer. - Dokumentér alle automatiske standarder, så administratorer kan se, hvor værdier kommer fra. - Test multi-company og brugerrollescenarier grundigt. Konklusion Automatisk forudfyldning i Odoo kan være alt fra et enkelt fast felt til et komplette lag af kontekstfølsomme og beregnede værdier. Vælg enkelhed, hvor det fungerer; flyt tung logik til server-side, hvor det er nødvendigt; og definer klare prioritetsregler for at undgå, at systemet kæmper imod brugeren. Med den rette balance mindsker du manuel indtastning, øger datakvaliteten og skaber en mere effektiv arbejdsgang.