1+ import re
2+
13from .filters import FiltersMixin
24from .limit_fields import LimitFieldsMixin
35from .pagination import PaginationMixin
46from .scope import ScopeMixin
57from .search import SearchMixin
68from .segment import SegmentMixin
79from django_forest .resources .utils .decorators import DecoratorsMixin
10+ from django_forest .utils .schema import Schema
811
912
1013class 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