Data Model

The data model is designed to behave similar to the Django ORM. The examples may be simple but flamingo should be capable of nearly all Django ORM operations that make sense to implement without SQL.

Examples

# all following examples use a ContentSet 'cs' created like this:

In [1]: from flamingo.core.data_model import ContentSet, Q

In [2]: cs = ContentSet()

In [3]: for i in range(5):
   ...:     cs.add(a=i)
   ...:

In [4]: cs
Out[4]: <ContentSet(<Content(a=0)>, <Content(a=1)>, <Content(a=2)>, <Content(a=3)>, <Content(a=4)>)>

Slices

# get all contents from index 1 to index 3

In [1]: cs[1:3]
Out[1]: <ContentSet(<Content(a=1)>, <Content(a=2)>)>

Simple filtering and excluding

# find all content objects with a == 2

In [1]: cs.filter(a=2)
Out[1]: <ContentSet(<Content(a=2)>)>

# find all content objects with a != 2

In [2]: cs.exclude(a=2)
Out[2]: <ContentSet(<Content(a=0)>, <Content(a=1)>, <Content(a=3)>, <Content(a=4)>)>

# get content object with a == 2

In [3]: cs.get(a=2)
Out[3]: <Content(a=2)>)

Filter chaining

# find all content objects with a greater than 1 and a lower than 4

In [1]: cs.filter(a__gt=1).filter(a__lt=4)
Out[1]: <ContentSet(<Content(a=2)>, <Content(a=3)>)>

Filter by callback

# find all content objects with a modulo 3 is 0

In [1]: cs.filter(a__passes=lambda a: a % 3 == 0)
Out[1]: <ContentSet(<Content(a=0)>, <Content(a=3)>)>

Negated Filter

# find all content objects with a is not 0

In [1]: cs.filter(~Q(a=0))
Out[1]: <ContentSet(<Content(a=1)>, <Content(a=2)>, <Content(a=3)>,
                    <Content(a=4)>)>

Interleaved Qs

# find all content objects with a equal (1, 2) or 3

In [1]: cs.filter(Q(Q(a=1) | Q(a=2)) | Q(a=3))
Out[1]: <ContentSet(<Content(a=1)>, <Content(a=2)>, <Content(a=3)>)>

F objects

# find all content objects with a equal b

In [1]: from flamingo.core.data_model import ContentSet, Q, F

In [2]: cs = ContentSet()

In [3]: for i in range(5):
   ...:     cs.add(a=i, b=1)
   ...:

In [4]: cs
Out[4]: <ContentSet(<Content(a=0, b=1)>, <Content(a=1, b=1)>,
                    <Content(a=2, b=1)>, <Content(a=3, b=1)>,
                    <Content(a=4, b=1)>)>

In [5]: cs.filter(a=F('b'))
Out[5]: <ContentSet(<Content(a=1, b=1)>)>

Available Lookups

Name

Operation

Description

eq

==

A is equal B

ne

!=

A is unequal B

lt

<

A is lower than B

lte

<=

A is lower equal than B

gt

>

A is greater than B

gte

>=

A is greater equal than B

in

in

A is in B

isnull

is None

A is None

isfalse

is False

A is False

contains

str(A) in str(B)

A contains B as string, case sensitive

icontains

str(A).lower() in str(B).lower()

A contains B as string, case insensitive

startswith

str(A).startswith(str(B))

A startswith B as string, case sensitive

istartswith

str(A).lower().startswith(str(B).lower())

A startswith B as string, case insensitive

passes

B(A)

A passes B

Content / ContentSet API

Add Contents to ContentSets

# ContentSet.add() takes Content objects or keyword arguments to create
# a Content object on the fly

In [1]: from flamingo.core.data_model import ContentSet, Content

In [2]: cs = ContentSet()
Out[2]: <ContentSet()>

In [3]: cs.add(Content(a=1))

In [4]: cs.add(a=2)

In [5]: cs
In [5]: <ContentSet(<Content(a=1)>, <Content(a=2)>)>

First / Last

In [1]: from flamingo.core.data_model import ContentSet

In [2]: cs = ContentSet()

In [3]: for i in range(5):
   ...:     cs.add(a=i)
   ...:

In [4]: cs
Out[4]: <ContentSet(<Content(a=0)>, <Content(a=1)>, <Content(a=2)>, <Content(a=3)>, <Content(a=4)>)>

In [5]: cs.first()
Out[5]: <Content(a=0)>

In [6]: cs.last()
Out[6]: <Content(a=4)>

Count

In [1]: from flamingo.core.data_model import ContentSet

In [2]: cs = ContentSet()

In [3]: cs.count()
Out[3]: 0

In [3]: len(cs)
Out[3]: 0