Skip to content

Commit ed3ae29

Browse files
API refactoring
- Specify prefetch_fields for optional child serializers - Ref: inventree#11012
1 parent ba7b776 commit ed3ae29

10 files changed

Lines changed: 37 additions & 29 deletions

File tree

src/backend/InvenTree/build/serializers.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1435,6 +1435,7 @@ class Meta:
14351435
can_build=False,
14361436
),
14371437
False,
1438+
prefetch_fields=['bom_item'],
14381439
)
14391440

14401441
assembly_detail = enable_filter(

src/backend/InvenTree/common/api.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -893,9 +893,7 @@ def filter_model_type(self, queryset, name, value):
893893
class ParameterMixin:
894894
"""Mixin class for Parameter views."""
895895

896-
queryset = common.models.Parameter.objects.all().prefetch_related(
897-
'model_type', 'updated_by', 'template', 'template__model_type'
898-
)
896+
queryset = common.models.Parameter.objects.all().prefetch_related('model_type')
899897
serializer_class = common.serializers.ParameterSerializer
900898
permission_classes = [IsAuthenticatedOrReadScope]
901899

src/backend/InvenTree/common/serializers.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -808,11 +808,15 @@ def save(self, **kwargs):
808808
)
809809

810810
updated_by_detail = enable_filter(
811-
UserSerializer(source='updated_by', read_only=True, many=False), True
811+
UserSerializer(source='updated_by', read_only=True, many=False),
812+
True,
813+
prefetch_fields=['updated_by'],
812814
)
813815

814816
template_detail = enable_filter(
815-
ParameterTemplateSerializer(source='template', read_only=True, many=False), True
817+
ParameterTemplateSerializer(source='template', read_only=True, many=False),
818+
True,
819+
prefetch_fields=['template', 'template_model_type'],
816820
)
817821

818822

src/backend/InvenTree/company/api.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -430,13 +430,6 @@ class SupplierPriceBreakMixin:
430430
queryset = SupplierPriceBreak.objects.all()
431431
serializer_class = SupplierPriceBreakSerializer
432432

433-
def get_queryset(self):
434-
"""Return annotated queryset for the SupplierPriceBreak list endpoint."""
435-
queryset = super().get_queryset()
436-
queryset = SupplierPriceBreakSerializer.annotate_queryset(queryset)
437-
438-
return queryset
439-
440433

441434
class SupplierPriceBreakOutputOptions(OutputConfiguration):
442435
"""Available output options for the SupplierPriceBreak endpoints."""

src/backend/InvenTree/company/serializers.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -572,12 +572,15 @@ def annotate_queryset(queryset):
572572
supplier_detail = enable_filter(
573573
CompanyBriefSerializer(
574574
source='part.supplier', many=False, read_only=True, allow_null=True
575-
)
575+
),
576+
False,
577+
prefetch_fields=['part__supplier'],
576578
)
577579

578580
part_detail = enable_filter(
579581
SupplierPartSerializer(
580582
source='part', brief=True, many=False, read_only=True, allow_null=True
581583
),
582584
False,
585+
prefetch_fields=['part', 'part__part', 'part__part__pricing_data'],
583586
)

src/backend/InvenTree/part/api.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,7 @@ class PartPricingDetail(RetrieveUpdateAPI):
570570
"""API endpoint for viewing part pricing data."""
571571

572572
serializer_class = part_serializers.PartPricingSerializer
573-
queryset = Part.objects.all()
573+
queryset = Part.objects.all().select_related('sub_part', 'sub_part__pricing_data')
574574

575575
def get_object(self):
576576
"""Return the PartPricing object associated with the linked Part."""
@@ -1361,6 +1361,8 @@ class BomOutputOptions(OutputConfiguration):
13611361
InvenTreeOutputOption('can_build', default=True),
13621362
InvenTreeOutputOption('part_detail'),
13631363
InvenTreeOutputOption('sub_part_detail'),
1364+
InvenTreeOutputOption('substitutes'),
1365+
InvenTreeOutputOption('pricing'),
13641366
]
13651367

13661368

src/backend/InvenTree/part/serializers.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1563,7 +1563,15 @@ def validate_quantity(self, quantity):
15631563
)
15641564

15651565
substitutes = enable_filter(
1566-
BomItemSubstituteSerializer(many=True, read_only=True, allow_null=True), True
1566+
BomItemSubstituteSerializer(many=True, read_only=True, allow_null=True),
1567+
False,
1568+
filter_name='substitutes',
1569+
prefetch_fields=[
1570+
'substitutes',
1571+
'substitutes__part',
1572+
'substitutes__part__stock_items',
1573+
'substitutes__part__pricing_data',
1574+
],
15671575
)
15681576

15691577
part_detail = enable_filter(
@@ -1684,9 +1692,7 @@ def annotate_queryset(queryset):
16841692
'sub_part__stock_items',
16851693
'sub_part__stock_items__allocations',
16861694
'sub_part__stock_items__sales_order_allocations',
1687-
'substitutes',
1688-
'substitutes__part__stock_items',
1689-
).select_related('part__pricing_data', 'sub_part__pricing_data')
1695+
)
16901696

16911697
# Annotate with the 'total pricing' information based on unit pricing and quantity
16921698
queryset = queryset.annotate(
@@ -1751,13 +1757,15 @@ class Meta:
17511757
source='template', many=False, read_only=True
17521758
),
17531759
True,
1760+
prefetch_fields=['template'],
17541761
)
17551762

17561763
category_detail = enable_filter(
17571764
CategorySerializer(
17581765
source='category', many=False, read_only=True, allow_null=True
17591766
),
17601767
True,
1768+
prefetch_fields=['category'],
17611769
)
17621770

17631771

src/backend/InvenTree/stock/serializers.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,8 @@ class Meta:
223223
read_only_fields = ['pk', 'user', 'date']
224224

225225
user_detail = enable_filter(
226-
UserSerializer(source='user', read_only=True, allow_null=True)
226+
UserSerializer(source='user', read_only=True, allow_null=True),
227+
prefetch_fields=['user'],
227228
)
228229

229230
template = serializers.PrimaryKeyRelatedField(
@@ -238,7 +239,8 @@ class Meta:
238239
template_detail = enable_filter(
239240
part_serializers.PartTestTemplateSerializer(
240241
source='template', read_only=True, allow_null=True
241-
)
242+
),
243+
prefetch_fields=['template'],
242244
)
243245

244246
attachment = InvenTree.serializers.InvenTreeAttachmentSerializerField(
@@ -1244,11 +1246,13 @@ class Meta:
12441246
label = serializers.CharField(read_only=True)
12451247

12461248
item_detail = enable_filter(
1247-
StockItemSerializer(source='item', many=False, read_only=True, allow_null=True)
1249+
StockItemSerializer(source='item', many=False, read_only=True, allow_null=True),
1250+
prefetch_fields=['item'],
12481251
)
12491252

12501253
user_detail = enable_filter(
1251-
UserSerializer(source='user', many=False, read_only=True, allow_null=True)
1254+
UserSerializer(source='user', many=False, read_only=True, allow_null=True),
1255+
prefetch_fields=['user'],
12521256
)
12531257

12541258
deltas = serializers.JSONField(read_only=True)

src/backend/InvenTree/users/api.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -291,13 +291,6 @@ class GroupMixin(SerializerContextMixin):
291291
serializer_class = GroupSerializer
292292
permission_classes = [InvenTree.permissions.IsStaffOrReadOnlyScope]
293293

294-
def get_queryset(self):
295-
"""Return queryset for this endpoint.
296-
297-
Note that the queryset is filtered by the permissions of the current user.
298-
"""
299-
return super().get_queryset().prefetch_related('rule_sets', 'user_set')
300-
301294

302295
class GroupOutputOptions(OutputConfiguration):
303296
"""Holds all available output options for Group views."""

src/backend/InvenTree/users/serializers.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,11 +268,13 @@ def get_permissions(self, group: Group) -> dict:
268268
source='rule_sets', many=True, read_only=True, allow_null=True
269269
),
270270
filter_name='role_detail',
271+
prefetch_fields=['rule_sets'],
271272
)
272273

273274
users = enable_filter(
274275
UserSerializer(source='user_set', many=True, read_only=True, allow_null=True),
275276
filter_name='user_detail',
277+
prefetch_fields=['user_set'],
276278
)
277279

278280

0 commit comments

Comments
 (0)