Skip to content

Commit 1daccfa

Browse files
authored
add select_related, get, and get_or_create comparisons (piccolo-orm#223)
1 parent 1f305f2 commit 1daccfa

File tree

1 file changed

+73
-3
lines changed

1 file changed

+73
-3
lines changed

docs/src/piccolo/query_types/django_comparison.rst

Lines changed: 73 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,51 @@ Django Comparison
66
Here are some common queries, showing how they're done in Django vs Piccolo.
77
All of the Piccolo examples can also be run :ref:`asynchronously<SyncAndAsync>`.
88

9+
-------------------------------------------------------------------------------
10+
911
Queries
1012
-------
1113

14+
get
15+
~~~
16+
17+
They are very similar, except Django raises an ``ObjectDoesNotExist`` exception
18+
if no match is found, whilst Piccolo returns ``None``.
19+
20+
.. code-block:: python
21+
22+
# Django
23+
>>> Band.objects.get(name="Pythonistas")
24+
<Band: 1>
25+
>>> Band.objects.get(name="DOESN'T EXIST") # ObjectDoesNotExist!
26+
27+
# Piccolo
28+
>>> Band.objects().get(Band.name == 'Pythonistas').run_sync()
29+
<Band: 1>
30+
>>> Band.objects().get(Band.name == "DOESN'T EXIST").run_sync()
31+
None
32+
33+
34+
get_or_create
35+
~~~~~~~~~~~~~
36+
37+
.. code-block:: python
38+
39+
# Django
40+
band, created = Band.objects.get_or_create(name="Pythonistas")
41+
>>> band
42+
<Band: 1>
43+
>>> created
44+
True
45+
46+
# Piccolo
47+
>>> band = Band.objects().get_or_create(Band.name == 'Pythonistas').run_sync()
48+
>>> band
49+
<Band: 1>
50+
>>> band._was_created
51+
True
52+
53+
1254
create
1355
~~~~~~
1456

@@ -39,7 +81,7 @@ update
3981
>>> band.save()
4082
4183
# Piccolo
42-
>>> band = Band.objects().where(Band.name == 'Pythonistas').first().run_sync()
84+
>>> band = Band.objects().get(Band.name == 'Pythonistas').run_sync()
4385
>>> band
4486
<Band: 1>
4587
>>> band.name = "Amazing Band"
@@ -57,7 +99,7 @@ Individual rows:
5799
>>> band.delete()
58100
59101
# Piccolo
60-
>>> band = Band.objects().where(Band.name == 'Pythonistas').first().run_sync()
102+
>>> band = Band.objects().get(Band.name == 'Pythonistas').run_sync()
61103
>>> band.remove().run_sync()
62104
63105
In bulk:
@@ -68,7 +110,7 @@ In bulk:
68110
>>> Band.objects.filter(popularity__lt=1000).delete()
69111
70112
# Piccolo
71-
>>> Band.delete().where(Band.popularity < 1000).delete().run_sync()
113+
>>> Band.delete().where(Band.popularity < 1000).run_sync()
72114
73115
filter
74116
~~~~~~
@@ -108,6 +150,34 @@ With ``flat=True``:
108150
>>> Band.select(Band.name).output(as_list=True).run_sync()
109151
['Pythonistas', 'Rustaceans']
110152
153+
select_related
154+
~~~~~~~~~~~~~~
155+
156+
Django has an optimisation called ``select_related`` which reduces the number
157+
of SQL queries required when accessing related objects.
158+
159+
.. code-block:: python
160+
161+
# Django
162+
band = Band.objects.get(name='Pythonistas')
163+
>>> band.manager # This triggers another db query
164+
<Manager: 1>
165+
166+
# Django, with select_related
167+
band = Band.objects.select_related('manager').get(name='Pythonistas')
168+
>>> band.manager # Manager is pre-cached, so there's no extra db query
169+
<Manager: 1>
170+
171+
Piccolo has something similar:
172+
173+
.. code-block:: python
174+
175+
# Piccolo
176+
band = Band.objects(Band.manager).get(name='Pythonistas')
177+
>>> band.manager
178+
<Manager: 1>
179+
180+
111181
-------------------------------------------------------------------------------
112182

113183
Database Settings

0 commit comments

Comments
 (0)