Skip to content

Commit bd181fe

Browse files
committed
Contains and other filter modifiers
1 parent 8d6fd4e commit bd181fe

14 files changed

Lines changed: 143 additions & 33 deletions

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
### 0.5.0
2+
3+
Added `contains` and other filter modifiers.
4+
5+
Field kwarg `default` not accepts functions.
6+
7+
18
### 0.4.0
29

310
Immutable QuerySet. `unique` flag for fields

docs/models_and_fields.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,5 +145,6 @@ Also all fields fields have this options:
145145
- ``source_field`` - field name in schema, can be different from field name
146146
- ``null`` - is field nullable
147147
- ``default`` - default value for field
148+
- ``unique`` - sets unique constraint for field
148149
- ``generated`` - flag that says that this field is read only and value should be generated in db. Normally, should be used only if you working on already created schema, not generated by tortoise.
149150

docs/query.rst

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,3 +92,29 @@ When you need to make ``OR`` query or something a little more challenging you co
9292
Q(id__in=[event_first.id, event_second.id]) | Q(name='3')
9393
)
9494
95+
96+
97+
Filtering
98+
=========
99+
100+
When using ``.filter()`` method you can use number of modifiers to field names to specify desired operation
101+
102+
.. code-block:: python
103+
104+
teams = await Team.filter(name__icontains='CON')
105+
106+
107+
- ``in`` - checks if value of field is in passed list
108+
- ``not_in``
109+
- ``gte`` - greater or equals than passed value
110+
- ``gt`` - greater than passed value
111+
- ``lte`` - lower or equals than passed value
112+
- ``lt`` - lower than passed value
113+
- ``isnull`` - field is null
114+
- ``not_isnull``
115+
- ``contains`` - field contains specified substring
116+
- ``icontains`` - case insensitive ``contains``
117+
- ``startswith`` - if field starts with value
118+
- ``istartswith`` - case insensitive ``startswith``
119+
- ``endswith`` - if field ends with value
120+
- ``iendswith`` - case insensitive ``endswith``

examples/basic.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
class Event(Model):
1515
id = fields.IntField(pk=True)
16-
name = fields.StringField()
16+
name = fields.TextField()
1717

1818
class Meta:
1919
table = 'event'

examples/complex_filtering.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,15 @@
1616

1717
class Tournament(Model):
1818
id = fields.IntField(pk=True)
19-
name = fields.StringField()
19+
name = fields.TextField()
2020

2121
def __str__(self):
2222
return self.name
2323

2424

2525
class Event(Model):
2626
id = fields.IntField(pk=True)
27-
name = fields.StringField()
27+
name = fields.TextField()
2828
tournament = fields.ForeignKeyField('models.Tournament', related_name='events')
2929
participants = fields.ManyToManyField('models.Team', related_name='events', through='event_team')
3030

@@ -34,7 +34,7 @@ def __str__(self):
3434

3535
class Team(Model):
3636
id = fields.IntField(pk=True)
37-
name = fields.StringField()
37+
name = fields.TextField()
3838

3939
def __str__(self):
4040
return self.name
@@ -80,6 +80,12 @@ async def run():
8080
events__name__in=['1', '3']
8181
).order_by('-events__participants__name').distinct()
8282

83+
teams = await Team.filter(name__icontains='CON')
84+
assert len(teams) == 1 and teams[0].name == 'Second'
85+
86+
tournaments = await Tournament.filter(events__participants__name__startswith='Fir')
87+
assert len(tournaments) == 1 and tournaments[0] == tournament
88+
8389

8490
if __name__ == '__main__':
8591
loop = asyncio.get_event_loop()

examples/relations.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,15 @@
1818

1919
class Tournament(Model):
2020
id = fields.IntField(pk=True)
21-
name = fields.StringField()
21+
name = fields.TextField()
2222

2323
def __str__(self):
2424
return self.name
2525

2626

2727
class Event(Model):
2828
id = fields.IntField(pk=True)
29-
name = fields.StringField()
29+
name = fields.TextField()
3030
tournament = fields.ForeignKeyField('models.Tournament', related_name='events')
3131
participants = fields.ManyToManyField('models.Team', related_name='events', through='event_team')
3232

@@ -36,7 +36,7 @@ def __str__(self):
3636

3737
class Team(Model):
3838
id = fields.IntField(pk=True)
39-
name = fields.StringField()
39+
name = fields.TextField()
4040

4141
def __str__(self):
4242
return self.name

examples/schema_create.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import asyncio
22

33
import datetime
4+
import secrets
45

56
from examples import get_db_name
67
from tortoise import Tortoise, fields
@@ -11,20 +12,25 @@
1112

1213
class Tournament(Model):
1314
id = fields.IntField(pk=True)
14-
name = fields.StringField()
15+
name = fields.TextField()
1516
created = fields.DatetimeField(auto_now_add=True)
1617

1718
def __str__(self):
1819
return self.name
1920

2021

22+
def generate_token():
23+
return secrets.token_hex(16)
24+
25+
2126
class Event(Model):
2227
id = fields.IntField(pk=True)
23-
name = fields.StringField(unique=True)
28+
name = fields.TextField(unique=True)
2429
tournament = fields.ForeignKeyField('models.Tournament', related_name='events')
2530
participants = fields.ManyToManyField('models.Team', related_name='events', through='event_team')
2631
modified = fields.DatetimeField(auto_now=True)
2732
prize = fields.DecimalField(max_digits=10, decimal_places=2, null=True)
33+
token = fields.TextField(default=generate_token)
2834

2935
def __str__(self):
3036
return self.name
@@ -53,6 +59,7 @@ async def run():
5359
event.name = 'Test 2'
5460
await event.save()
5561
assert event.modified > old_time
62+
assert len(event.token) == 32
5663

5764

5865
if __name__ == '__main__':

examples/transactions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
class Event(Model):
2020
id = fields.IntField(pk=True)
21-
name = fields.StringField()
21+
name = fields.TextField()
2222

2323
class Meta:
2424
table = 'event'

examples/two_databases.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
class Tournament(Model):
2323
id = fields.IntField(pk=True)
24-
name = fields.StringField()
24+
name = fields.TextField()
2525

2626
def __str__(self):
2727
return self.name
@@ -32,7 +32,7 @@ class Meta:
3232

3333
class Event(Model):
3434
id = fields.IntField(pk=True)
35-
name = fields.StringField()
35+
name = fields.TextField()
3636
tournament_id = fields.IntField()
3737
# Here we make link to events.Team, not models.Team
3838
participants = fields.ManyToManyField('events.Team', related_name='events', through='event_team')
@@ -46,7 +46,7 @@ class Meta:
4646

4747
class Team(Model):
4848
id = fields.IntField(pk=True)
49-
name = fields.StringField()
49+
name = fields.TextField()
5050

5151
def __str__(self):
5252
return self.name

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ def version():
6565
# Details
6666
url="https://github.com/Zeliboba5/tortoise-orm",
6767

68-
description="Easy for use async ORM for python",
68+
description="Easy async ORM for python, built with relations in mind",
6969
long_description=readme(),
7070

7171
classifiers=[

0 commit comments

Comments
 (0)