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.
# all following examples use a ContentSet 'cs' created like this:
In [1]: from flamingo 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)>)>
# get all contents from index 1 to index 3
In [1]: cs[1:3]
Out[1]: <ContentSet(<Content(a=1)>, <Content(a=2)>)>
# 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)>)
# 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)>)>
# 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)>)>
# 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)>)>
# 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)>)>
# find all content objects with a equal b
In [1]: from flamingo 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)>)>
| 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 | |
# ContentSet.add() takes Content objects or keyword arguments to create
# a Content object on the fly
In [1]: from flamingo 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)>)>
In [1]: from flamingo 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)>
In [1]: from flamingo import ContentSet
In [2]: cs = ContentSet()
In [3]: cs.count()
Out[3]: 0
In [3]: len(cs)
Out[3]: 0