From 2e9fe29e99491d2bdc9fa8f262bb25e7b7fde58a Mon Sep 17 00:00:00 2001 From: Jon Date: Thu, 15 May 2025 19:45:04 +0930 Subject: [PATCH] fix(api): Correct ViewSet Sub-Model lookup ref: #761 --- app/api/viewsets/common.py | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/app/api/viewsets/common.py b/app/api/viewsets/common.py index bfee9eab..4a5a2629 100644 --- a/app/api/viewsets/common.py +++ b/app/api/viewsets/common.py @@ -793,7 +793,8 @@ class SubModelViewSet( def related_objects(self, model, model_kwarg): """Recursive relate_objects fetch - Fetch the model that is lowest in the chain of inherited models + Fetch the model where ._meta.sub_model_type matches the + model_kwarg value. Args: model (django.db.models.Model): The model to obtain the @@ -801,13 +802,15 @@ class SubModelViewSet( model_kwarg (str): The URL Kwarg of the model. Returns: - _type_: _description_ + Model: The model for the ViewSet """ related_model = None if model_kwarg: + is_nested_lookup = False + for related_object in model._meta.related_objects: if( @@ -833,9 +836,23 @@ class SubModelViewSet( related_model = self.related_objects(model = related_object.related_model, model_kwarg = model_kwarg) + is_nested_lookup = True - if related_model is None: + if( + str( + related_model._meta.sub_model_type + ).lower().replace(' ', '_') == model_kwarg + ): + + break + + else: + + related_model = None + + + if related_model is None and not is_nested_lookup: related_model = self.base_model