@@ -6,9 +6,51 @@ Django Comparison
66Here are some common queries, showing how they're done in Django vs Piccolo.
77All of the Piccolo examples can also be run :ref: `asynchronously<SyncAndAsync> `.
88
9+ -------------------------------------------------------------------------------
10+
911Queries
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
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
113183Database Settings
0 commit comments