Introduktion
Binary-fältet är kanske inte det mest glamorösa i en Odoo-implementering, men det finns i princip överallt. Varje gång någon laddar upp ett signerat avtal, bifogar en produktdatablad eller sparar en företagslogotyp på en post så ligger det ett Binary-fält bakom scenen som hanterar filerna. Att förstå hur datan sparas, var den hamnar och när man i stället bör välja andra fälttyper är avgörande när du bygger formulär eller utökar Odoo-modeller.
Den här guiden går igenom vad Binary-fältet egentligen innehåller, hur valet mellan lagringslägen påverkar prestanda, hur du skapar och anpassar fältet via Odoo Studio eller i Python, samt konkreta användningsområden inom CRM, HR, lagerhantering med mera.
Vad är fältet Binary i Odoo
I Odoos ORM representerar Binary-fältet (fields.Binary) rå binärdata — allt från dokument och PDF:er till bilder och andra filer som användaren laddar upp till en post. I formulärvyn möts användaren av en enkel uppladdningskontroll; när filen ligger där fungerar samma kontroll som nedladdningsknapp.
Den viktigaste tekniska aspekten är var filinnehållet faktiskt lagras. I moderna Odoo-versioner används som standard attachment-läget: filens bytes ligger i ir.attachment och i filsystemets filstore, medan själva modellen bara sparar en referens. Det håller tabellerna smala och låter Odoo hantera filerna effektivt.
I Odoo Studio heter motsvarande fälttyp "File" i fältväljaren och renderar som en av- och uppladdningskontroll i formulär. För bilder finns dessutom fields.Image som ger automatisk skalning och förhandsvisning — använd den när innehållet är visuellt.
Så här kan ett Binary-fält definieras i en Python-modell:
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',
)
Lägg märke till den kompletterande Char-fältet x_signed_contract_filename. Det är en etablerad praxis att ha ett _filename-fält tillsammans med Binary-fältet så att Odoo kan visa och återställa originalfilens namn vid nedladdning.
Hur fältet fungerar
När du deklarerar ett Binary-fält i modellen sköter Odoo själva databasändringen automatiskt vid installation eller uppgradering av modulen — ingen SQL-manipulation behövs från din sida.
Lagringslägen
Parametern attachment på ett Binary-fält styr var filbytes faktiskt lagras:
- attachment=True (rekommenderas): Innehållet lagras i ir.attachment och länkas till posten via modellnamn och ID. Modellkolumnen innehåller bara en referens. Det minskar databasstorleken och använder Odoos filstore.
- attachment=False: Den base64-kodade filen sparas direkt i modellens kolumn. Det gör tabeller stora och sänker prestandan vid sökningar. Undvik detta för annat än små miniatyrbilder.
Dataformat
Binary-fält hanterar data som base64-kodade strängar. När du läser via ORM eller XML-RPC får du en base64-sträng; när du skriver måste du ge samma format.
I praktiken betyder det: koda när du skriver och avkoda när du läser.
import base64
# Skriva en fil till ett Binary-fält
with open('document.pdf', 'rb') as f:
encoded = base64.b64encode(f.read()).decode('utf-8')
record.write({'x_signed_contract': encoded})
# Läsa en fil från ett Binary-fält
raw_bytes = base64.b64decode(record.x_signed_contract)
Viktiga fältattribut
Här är de attribut du oftast behöver tänka på när du definierar ett Binary-fält i Odoo:
- attachment: Boolean. Om filen sparas i ir.attachment (True) eller i kolumnen (False). I nyare Odoo-versioner är standard True.
- string: Visningsetikett i gränssnittet.
- required: Gör fältet obligatoriskt innan posten sparas.
- compute: Kopplar fältet till en Python-metod för beräknat innehåll, exempelvis generera en PDF vid behov.
- store: Vid compute sparas det beräknade värdet i databasen om detta är True.
- groups: Begränsar åtkomst till vissa användargrupper — viktigt för känsliga dokument.
- copy: Styr om värdet ska kopieras vid duplicering av en post. Beteende kan variera beroende på attachment-inställning och Odoo-version.
Undertypen fields.Image
fields.Image är en specialiserad variant av fields.Binary (införd i Odoo 13) som skalar ned bilder automatiskt till högsta tillåtna dimension och genererar förhandsvisningar. För produktbilder, profilbilder och logotyper ger det en bättre användarupplevelse och minskar risken för onödigt stora uppladdningar.
Hur det syns i vyer
I formulärvyer visas Binary som en uppladdnings-/nedladdningskontroll. För bilder använd widgeten image för att få en miniatyr. I listvyer visar man normalt inte hela Binary-innehållet eftersom det kräver stora datamängder — istället kan man visa en ikon eller en beräknad boolean som indikerar om en fil finns.
Affärsfall i praktiken
Binary-fält används i många Odoo-moduler. Nedan följer fem konkreta exempel där fältet löser vanliga behov i företaget.
CRM: Spara signerade avtal på kundposten
Säljteam vill ofta ha kundens NDA eller kontrakt liggande direkt på partner- eller lead-posten. Ett Binary-fält på res.partner eller crm.lead ger snabb åtkomst utan att lämna Odoo, vilket räcker för grundläggande dokumenthantering och håller all relevant information samlad i säljprocessen.
HR: Medarbetardokument
HR behöver lagra ID-handlingar, arbetstillstånd, anställningsavtal och utbildningsintyg. Binary-fält på hr.employee placerar dessa filer inom Odoos behörighetssystem. Med groups-attributet kan du begränsa vem som ser filerna så att endast HR-personal får åtkomst medan andra chefer bara ser att dokument finns.
Lager: Produktspecifikationer och säkerhetsdatablad
För tekniska produkter är det vanligt att ha PDF-specifikationer eller säkerhetsdatablad på produktposten. Ett Binary-fält på product.template ger inköp och lager personal direkt tillgång till rätt dokument från produktkortet — en enkel och ofta efterfrågad funktion i tillverkande företag.
Sälj: Stämpel eller signatur på offerter
I vissa verksamheter behöver offerter eller orderbekräftelser innehålla företagets stämpel eller en auktoriserad signatur. Ett fields.Image på res.company lagrar denna bild så att QWeb-rapporter kan inkludera den automatiskt — praktiskt i volymförsäljning där man vill undvika manuella moment.
Ekonomi: Skannade kvitton på utlägg
I utläggsflöden måste kvitton bifogas som bevis vid ersättning. För standardmodulen finns det stöd via attachment-systemet, men i anpassade modeller eller tredjepartsintegrationer är ett Binary-fält en tydlig lösning för att lagra kvitto-bilder eller PDF:er direkt på posten och koppla dem till godkännandeprocessen.
Skapa eller anpassa Binary-fältet
Tre sätt att lägga till ett Binary-fält beroende på behov och teknisk nivå.
Via Odoo Studio (utan kod)
Odoo Studio är verktyget för lågkodsanpassning. Så här lägger du till ett Binary-fält utan att skriva kod:
- Öppna Odoo Studio från huvudmenyn.
- Gå till det formulär där fältet ska finnas.
- Dra in ett File-fält från fältväljaren till formuläret.
- Ge det en etikett och ställ in synlighetsvillkor i egenskapsrutan vid behov.
- Spara och stäng Studio.
Studio skapar fältet med prefixet x_studio_ och använder attachment-läge automatiskt. Det är ett snabbt sätt för affärsanvändare att få filuppladdning i sina formulär utan utvecklarhjälp.
Via Python i en anpassad modul
För spårbarhet, versionshantering och upprepbar distribution är Python-definition i en modul rekommenderat. Det är standardmetoden för seriösa anpassningar:
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 att fältet är tillagt inkluderar du det i formulärvyn med widgeten binary och filename-atributet som pekar på det kompletterande Char-fältet. Odoo tar hand om databaskolumnen vid installation/upgradering och metoden fungerar konsekvent i alla driftsmiljöer.
Via XML-RPC API
Om du automatiskt konfigurerar en instans eller kör script för distribution kan du skapa fält programatiskt 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',
}]
)
state: 'manual' markerar att fältet skapats dynamiskt snarare än av en modul. Fält som skapas via API använder som standard attachment-läge i moderna Odoo-versioner — vanligen rätt val för automatiserade konfigurationer.
Rekommenderade arbetssätt
1. Använd alltid attachment=True
Spara inte filbytes direkt i modellkolumnen om du inte har ett mycket starkt skäl. Attachment-läget håller tabellerna små, förhindrar långsamma sökningar och utnyttjar Odoos filsystem. För alla filer bortom små miniatyrer är attachment-läge i praktiken obligatoriskt.
2. Kombinera Binary med ett filename-Char-fält
Lägg alltid till ett _filename-fält bredvid Binary-fältet i formulärvyer. Utan det visas och återställs inte originalfilnamnet i widgeten, och användarna får ofta en generisk fil vid nedladdning. Det är en enkelt åtgärd som förbättrar användarupplevelsen avsevärt.
3. Använd fields.Image för bilder
För produktbilder, profilbilder och logotyper — välj fields.Image. Den ser till att uppladdningar inte blir onödigt stora, skapar miniatyrbilder och ger en bättre visning i gränssnittet. Rätt fälttyp för rätt innehåll förenklar både UI och lagring.
4. Begränsa åtkomst med groups
För känsliga dokument som personalakter, signerade kontrakt eller ekonomiska handlingar bör du använda groups-attributet för att styra vem som kan läsa och skriva fältet. Det är viktigt både för integritet och för revisionskrav i reglerade miljöer.
5. Hantera base64 noggrant i din kod
Vid programmatisk läsning/skrivning måste du alltid konvertera bytes till base64 innan skrivning och avkoda efter läsning. Använd base64.b64encode(file_bytes).decode('utf-8') vid skrivning och base64.b64decode(field_value) vid läsning. Antag inte att data redan är i rätt format — det är en vanlig felkälla.
Vanliga fallgropar
Risken med attachment=False för stora filer
Att lagra filer direkt i databaskolumnen kan snabbt göra PostgreSQL-tabeller svårhanterliga. Ett fåtal PDF:er med attachment=False kan lägga till hundratals megabyte i en modelltabell och skala bort prestanda från hela systemet. Att migrera bort från detta kräver skript och noggrann planering.
Att glömma filename-kompanjonen
Utan ett kompletterande Char-fält får nedladdade filer ofta ett generiskt namn, vilket känns som en halvfärdig lösning. Att lägga till filename-fältet tar knappt en minut och bör vara standard när Binary-fält visas i användarformulär.
Förväxla inte Binary och Image
Använd inte ett generiskt Binary-fält för bilder — då missar du automatisk skalning och miniatyrer. Omvänt leder fields.Image till fel om du försöker lagra PDF:er, eftersom systemet försöker behandla innehållet som en bild. Matcha alltid fälttyp efter förväntat innehåll.
Att visa Binary i listvyer
Om du lägger ett Binary-fält direkt i en listvy tvingas Odoo att ladda filinnehållet för varje rad. För en lista med många poster kan det innebära megabyte överförd data — använd istället en beräknad boolean eller ikon för att visa att en fil finns.
Glöm inte att kontrollera False innan du processar
Ett tomt Binary-fält returnerar False i Python, inte en tom sträng. Försök inte att avkoda utan att först kontrollera värdet — annars får du TypeError. Skriv alltid säkerhetskontroller som: if record.x_document: data = base64.b64decode(record.x_document). Detta gäller i beräkningsmetoder, serveractions och integrationskod.
Sammanfattning
Binary-fältet är enkelt till sin konstruktion men centralt i Odoo-modellens funktion. Det kopplar fil- och dokumenthantering till Odoos befintliga gränssnitt, bilagor och åtkomstregler på ett effektivt sätt.
De viktigaste vanorna att etablera: använd attachment-läge, lägg till ett filename-Char-fält, välj fields.Image för visuellt innehåll, begränsa åtkomst för känsliga filer och hantera base64-explicit i kod. Dessa rutiner förhindrar de vanligaste problemen innan de uppstår i produktion.
Oavsett om du lägger till fält via Odoo Studio, skriver en modul i Python eller skapar fält via ORM/XML-RPC, leder korrekta Binary-implementeringar till en renare och mer robust Odoo-lösning från start.
På Dasolo hjälper vi företag att implementera, anpassa och optimera Odoo i alla avdelningar. Vi kan stötta med datamodellering, filhanteringsflöden eller fullständiga moduler — från analys till leverans. Kontakta oss så pratar vi om ditt Odoo-projekt.