Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
30acf3c
reverse lookup prototype
sinisaos Aug 25, 2022
5940304
docstring fix
sinisaos Aug 26, 2022
c74e89e
remove reverse_lookup_name
sinisaos Aug 28, 2022
2839931
update docstring
sinisaos Aug 28, 2022
dfc1bb0
Merge branch 'piccolo-orm:master' into reverse_lookup
sinisaos Aug 28, 2022
292186b
Merge dfc1bb048da4a453604292a9843fe69db1f9f0df into 45dbb8b3053313ea9…
sinisaos Oct 5, 2022
8f47af2
Merge branch 'master' into reverse_lookup
powellnorma Dec 16, 2022
f98e0b3
reverse lookup: some fixes
powellnorma Dec 16, 2022
9a5ba3e
reverse_lookup.py: update docstrings
powellnorma Dec 18, 2022
d6c6453
reverse lookup: remove excess 's'
powellnorma Dec 18, 2022
c4f2777
Merge pull request #1 from powellnorma/reverse_lookup
sinisaos Dec 19, 2022
5f5221b
Merge branch 'piccolo-orm:master' into reverse_lookup
sinisaos Dec 19, 2022
b3a0e27
fix tests and linter errors
sinisaos Dec 19, 2022
a7405b7
Merge branch 'master' into reverse_lookup
sinisaos Mar 8, 2023
4b58c8c
Resolve merge conflict
sinisaos Dec 9, 2024
b42daf7
update the branch code
sinisaos Dec 9, 2024
bacb08d
add docs
sinisaos Dec 10, 2024
70b183a
fix indentation in docs
sinisaos Dec 11, 2024
bda0815
add option to change default order in results
sinisaos Dec 13, 2024
382a100
Merge branch 'piccolo-orm:master' into reverse_lookup
sinisaos Jan 9, 2025
5c65821
Merge branch 'piccolo-orm:master' into reverse_lookup
sinisaos Jan 20, 2025
c748a2b
Merge branch 'piccolo-orm:master' into reverse_lookup
sinisaos Jan 26, 2025
aa1c4df
Merge branch 'piccolo-orm:master' into reverse_lookup
sinisaos Feb 12, 2025
653966f
Merge branch 'piccolo-orm:master' into reverse_lookup
sinisaos Apr 4, 2025
b8afed0
Merge branch 'piccolo-orm:master' into reverse_lookup
sinisaos Apr 15, 2025
4757448
add object queries
sinisaos Apr 15, 2025
dc9c448
add docs for object queries
sinisaos Apr 15, 2025
08571e4
Merge branch 'piccolo-orm:master' into reverse_lookup
sinisaos Apr 28, 2025
d0b4b47
Merge branch 'piccolo-orm:master' into reverse_lookup
sinisaos May 24, 2025
44748a0
Merge branch 'piccolo-orm:master' into reverse_lookup
sinisaos Jun 4, 2025
1c47041
Merge branch 'piccolo-orm:master' into reverse_lookup
sinisaos Jun 9, 2025
11d6e37
Merge branch 'master' into reverse_lookup
sinisaos Jun 10, 2025
537fede
fix linter errors from merge conflicts
sinisaos Jun 10, 2025
c40d81e
Merge branch 'piccolo-orm:master' into reverse_lookup
sinisaos Jul 16, 2025
608c8cf
Merge branch 'piccolo-orm:master' into reverse_lookup
sinisaos Jul 27, 2025
a9a07cc
Merge branch 'piccolo-orm:master' into reverse_lookup
sinisaos Jul 29, 2025
61a0398
Merge branch 'piccolo-orm:master' into reverse_lookup
sinisaos Oct 22, 2025
10acfb9
fix linter error with type ignore
sinisaos Oct 22, 2025
26cb498
Merge branch 'piccolo-orm:master' into reverse_lookup
sinisaos Oct 28, 2025
5c24103
Merge branch 'piccolo-orm:master' into reverse_lookup
sinisaos Dec 24, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/src/piccolo/schema/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@ The schema is how you define your database tables, columns and relationships.
./defining
./column_types
./m2m
./reverse_lookup
./one_to_one
./advanced
137 changes: 137 additions & 0 deletions docs/src/piccolo/schema/reverse_lookup.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
.. currentmodule:: piccolo.columns.reverse_lookup

##############
Reverse Lookup
##############

For example, we might have our ``Manager`` table, and we want to
get all the bands associated with the same manager.
For this we can use reverse foreign key lookup.

We create it in Piccolo like this:

.. code-block:: python

from piccolo.columns.column_types import (
ForeignKey,
LazyTableReference,
Varchar
)
from piccolo.columns.reverse_lookup import ReverseLookup
from piccolo.table import Table


class Manager(Table):
name = Varchar()
bands = ReverseLookup(
LazyTableReference("Band", module_path=__name__),
reverse_fk="manager",
)


class Band(Table):
name = Varchar()
manager = ForeignKey(Manager)

-------------------------------------------------------------------------------

Select queries
==============

If we want to select each manager, along with a list of associated band names,
we can do this:

.. code-block:: python

>>> await Manager.select(Manager.name, Manager.bands(Band.name, as_list=True))
[
{'name': 'John', 'bands': ['C-Sharps']},
{'name': 'Guido', 'bands': ['Pythonistas', 'Rustaceans']},
]

You can request whichever column you like from the reverse lookup:

.. code-block:: python

>>> await Manager.select(Manager.name, Manager.bands(Band.id, as_list=True))
[
{'name': 'John', 'bands': [3]},
{'name': 'Guido', 'bands': [1, 2]},
]

You can also request multiple columns from the reverse lookup:

.. code-block:: python

>>> await Manager.select(Manager.name, Manager.bands(Band.id, Band.name))
[
{
'name': 'John',
'bands': [
{'id': 3, 'name': 'C-Sharps'},
]
},
{
'name': 'Guido',
'bands': [
{'id': 1, 'name': 'Pythonistas'},
{'id': 2, 'name': 'Rustaceans'},
]
}
]

If you omit the columns argument, then all of the columns are returned.

.. code-block:: python

>>> await Manager.select(Manager.name, Manager.bands())
[
{
'name': 'John',
'bands': [
{'id': 3, 'name': 'C-Sharps'},
]
},
{
'name': 'Guido',
'bands': [
{'id': 1, 'name': 'Pythonistas'},
{'id': 2, 'name': 'Rustaceans'},
]
}
]

The default order of reverse lookup results is ascending, but if you
specify ``descending=True``, you can get the results in descending order.

.. code-block:: python

>>> await Manager.select(Manager.name, Manager.bands(descending=True))
[
{
'name': 'John',
'bands': [
{'id': 3, 'name': 'C-Sharps'},
]
},
{
'name': 'Guido',
'bands': [
{'id': 2, 'name': 'Rustaceans'},
{'id': 1, 'name': 'Pythonistas'},
]
}
]

Object queries
==============

We can also use object queries to ``ReverseLookup``.

get_reverse_lookup
------------------

.. currentmodule:: piccolo.table

.. automethod:: Table.get_reverse_lookup
:noindex:
Loading