Skip to content

Commit 78b3eff

Browse files
committed
perf: add basic inner joins
1 parent b7286ac commit 78b3eff

File tree

1 file changed

+29
-0
lines changed

1 file changed

+29
-0
lines changed

django_forest/resources/utils/queryset/__init__.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1+
import re
2+
13
from .filters import FiltersMixin
24
from .limit_fields import LimitFieldsMixin
35
from .pagination import PaginationMixin
46
from .scope import ScopeMixin
57
from .search import SearchMixin
68
from .segment import SegmentMixin
79
from django_forest.resources.utils.decorators import DecoratorsMixin
10+
from django_forest.utils.schema import Schema
811

912

1013
class QuerysetMixin(
@@ -26,7 +29,33 @@ def filter_queryset(self, queryset, Model, params, request):
2629
queryset = queryset.filter(method(params, Model))
2730
return queryset
2831

32+
def join_relations(self, queryset, Model, params, request):
33+
select_related = set()
34+
35+
collection = Schema.get_collection(Model._meta.db_table)
36+
relations = [
37+
field['field']
38+
for field in collection["fields"]
39+
if field["relationship"] is not None and field["relationship"] in ["BelongsTo", "HasOne"]
40+
]
41+
42+
# scope
43+
44+
# filters
45+
46+
# projection
47+
for key, value in params.items():
48+
if re.search(r"fields\[[^\]]+\]", key):
49+
fields_for = key.split("fields[")[1][:-1]
50+
if fields_for in relations:
51+
select_related.add(fields_for)
52+
53+
return queryset.select_related(*select_related)
54+
2955
def enhance_queryset(self, queryset, Model, params, request, apply_pagination=True):
56+
# perform inner join
57+
queryset = self.join_relations(queryset, Model, params, request)
58+
3059
# scopes + filter + search
3160
queryset = self.filter_queryset(queryset, Model, params, request)
3261

0 commit comments

Comments
 (0)