Skip to main content

This library serves as a wrapper around Google's Firestore. It implements validation, type checking facilities, and relational (work in progress) model logic.

Project description

## python-firestore-models

This library serves as a wrapper around Google's Firestore. It implements validation, type checking facilities,
and relational (work in progress) model logic.

## When to Use

When you want a simple abstraction layer on top of Firestore to help you keep track of entities and their relationships,
the way you would achieve it with an ORM. The library's API borrows several design paradigms from Django's ORM, because
I like Django's ORM.

## Installation
`pip install <library_name>`


## Basic Usage

### Environment
You will need to set up your environment in the usual way to have access to your resources on
Google Cloud Platform.

```
import os
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = '/path/to/credentials.json'
```

If you do not have this variable set, model instances will log a warning, and nothing will
actually work with Firestore.

### Creating, Fetching, and Deleting
```
from fsmodels.models import Model
from fsmodels.fields import Field

def is_valid_string(value):
return value is None or isinstance(value, str), f'value must be str, cannot be {value}'


class User(Model):

username = Field(required=True)
password = Field(required=True)
first_name = Field(required=True, default='Billy')
last_name = Field(validation=is_valid_string)
created_date = Field(default=time.time)


my_user = User(username='user1', password='goodpassword')
my_user.save() # automatically generates a new id and creates this user in firestore.
my_user.retrieve() # returns a dict of the record in firestore
my_user.delete() # deletes the record in firestore with my_user.id


my_user2 = User(username='user2') # validation functions are not called on __init__ by defalt
my_user2.save() # raises a validation error; password is a required field.
```

### Edit Existing
```
user = User(id='my_id')

# retrieve ignores everything about the local model instance other than the id
user.retrieve(overwrite_local=True)

print(user.to_dict()) # see what was in firestore
user.first_name = 'a different name'
user.save()
```

### Delete Existing
```
user = User(id='my_id')

user.delete()
```

## Advanced Usage
### One to One Relationships

```
import uuid

from fsmodels.models import Model
from fsmodels.fields import Field, ModelField, IDField

def uuid_as_str():
return str(uuid.uuid4())

class Profile(Model):
id = IDField(required=True, default=uuid_as_str)
first_name = Field(required=True)
last_name = Field(required=True)

class User(Model):
id = IDField(required=True, default=uuid_as_str)
username = Field(required=True)
password = Field(required=True)
profile = ModelField(Profile, required=True)

profile = Profile(first_name='Billy', last_name='Mayes')
# will save both the profile and the user
user = User(username='bmayes', password='plaintextpassword', profile=profile)

print(user.retrieve())
#{'profile': {'id': 'bd3ca41a-b6c4-4249-ac48-eb05db79bb3d',
# 'first_name': 'Billy',
# 'last_name': 'Mayes'},
# 'password': 'plaintextpassword',
# 'username': 'bmayes',
# 'profile_id': 'bd3ca41a-b6c4-4249-ac48-eb05db79bb3d',
# 'id': '1e586d79-f2c0-4618-a7f7-95308a54298e'}

print(profile.retrieve())
#{'user_id': '1e586d79-f2c0-4618-a7f7-95308a54298e',
# 'first_name': 'Billy',
# 'last_name': 'Mayes',
```

### One to Many Relationships
Planned.

### Overriding Defaults
```
# model_name in error messages and collection name in firestore is my_model1
class MyModel1(Model):
first_name = Field(required=True)
last_name = Field(required=True)

class Meta:
model_name = 'Profiles'

# model_name in error messages and collection name in firestore is MY-MODEL-2
class MyModel2(Model):
first_name = Field(required=True)
last_name = Field(required=True)

class Meta:
model_name = 'MY-MODEL-2'

# model_name in error messages is my_model3 and collection name in firestore is mY-mODeL-3
class MyModel3(Model):
first_name = Field(required=True)
last_name = Field(required=True)

class Meta:
collection = 'mY-mODeL-3'
```

### Using Google's firestore API
```
class MyModel1(Model):
first_name = Field(required=True)
last_name = Field(required=True)

m = MyModel1()

# same as google.cloud.firestore
m.firestore
# same as google.cloud.firestore.Client()
m.db
# same as google.cloud.firestore.Client().collection(m._collection) where m._collection in this case is my_model1
m.collection

# you can do stuff like
for record in m.collection.get():
print(record.to_dict())
```

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fsmodels-0.1.0.dev0.tar.gz (13.4 kB view details)

Uploaded Source

File details

Details for the file fsmodels-0.1.0.dev0.tar.gz.

File metadata

  • Download URL: fsmodels-0.1.0.dev0.tar.gz
  • Upload date:
  • Size: 13.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: Python-urllib/3.7

File hashes

Hashes for fsmodels-0.1.0.dev0.tar.gz
Algorithm Hash digest
SHA256 480a04155e65444cb5b73b53516ec2727a1f54c51fc07707d9cdf8a391b2abd8
MD5 ece338350943591b00fc6bc65a95f4d3
BLAKE2b-256 058babfcb08f57217df6085101f3bbe16f784d6a08c1c41d917c125790411ff8

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page