py-fhir
FHIR Resources/Elements for Python. Code generated by py-fhir-codegen.
Introduction
This python package provides a python version of the Resources and Elements specified in the FHIR specification. Additionally, the package includes first steps towards database persistance (using SQLAlchemy) and a client.
How to use Resources and DataTypes
Running the following code creates a Patient and assigns values to different attributes. Finally, the object is serialized to JSON representation and the result is printed.
# Import the relevant classes from fhir.model
from fhir.model import Patient, HumanName, Identifier, CodeableConcept, Coding, uri
# Create a new Patient object. Resource attributes can be passed in the constructor. Note
# that 'id' is the logical id of the Resource and has no relation to the Medical Record
# Number (MRN)
p = Patient(id='patient1')
# Give the patient an MRN
identifier = Identifier(
type=CodeableConcept(coding=[Coding(system="http://hl7.org/fhir/v2/0203", code="MR")]),
system='urn:oid:1.2.36.146.595.217.0.1',
value='123456789'
)
# Lists can be assigned to attributes.
# Alternatively p.identifier.append(identifier) could have been used.
p.identifier = [identifier]
# Native python values are automatically coerced to FHIR classes
p.active = True
print(type(p.active))
# output: <class 'fhir.model._boolean.boolean'>
name = HumanName()
name.use = 'official'
name.given = ['Melle', 'Sjoerd']
name.family = 'Sieswerda'
p.name = [name]
# Serialize to JSON and print the result. To serialize to XML use 'p.toXML()'.
print(p.dumps('json'))
This should yield the following output:
{
"resourceType": "Patient",
"id": "patient1",
"identifier": [
{
"type": {
"coding": [
{
"system": "http://hl7.org/fhir/v2/0203",
"code": "MR"
}
]
},
"system": "urn:oid:1.2.36.146.595.217.0.1",
"value": "123456789"
}
],
"active": true,
"name": [
{
"use": "official",
"family": [
"Sieswerda"
],
"given": [
"Melle",
"Sjoerd"
]
}
]
}
It is also possible to marshall an object from JSON (or XML) representation:
jsonstring = p.dumps('json')
p2 = Patient.loads(jsonstring, 'json')
p2.id == p.id
# output: True
Using the client
import fhir.model
import fhir.client
from fhir.model import Patient, HumanName
URL = fhir.client.SERVERS['spark']
client = fhir.client.Client(URL)
client.set_properties(fhir.model.Resource)
# The following is equivalent to
# bundle = client.query('Patient')
bundle = fhir.model.Patient.query()
# Print the first result we received
for p in bundle:
print(p.dumps('json'))
break
# Create a new patient on the server
p = Patient()
p.active = True
name = HumanName(
use='official',
given=['Melle'],
family='Testpatient'
)
p.name = [name]
p.save()
print('The server assigned id "{}"'.format(p.id))
Using persistant storage
Cave: the current implementation should be considered a stub. Searching/querying, updating, etc. is not (yet) supported.
from fhir.persistance import FHIRStore
import fhir.model
# By default FHIRStore creates a sqlite database in the current directory.
# Still, be careful when using 'drop_all'!
store = FHIRStore(drop_all=True)
# Create a new Patient
p = fhir.model.Patient()
p.id = 'patient1'
p.active = True
name = fhir.model.HumanName(
use='official',
given=['Melle', 'Sjoerd'],
family='Sieswerda'
)
p.name = [name]
# Store the patient
store.post(p)
# Retrieve the patient from the store and print the result.
print(store.get('patient1'))
# output: <fhir.model.patient.Patient object at 0x1096dd828>