Как получить один вложенный дочерний объект в родительском сериализованном объекте, когда модели связаны с внешним ключом?

У меня есть связанные модели, такие как:

class ModelC(models.Model):
    name = models.CharField()

class ModelA(models.Model):
    state = models.Charfield()
    modelc = models.ForeingKey(ModelC, through='ModelAModelCRelation')

class ModelAModelCRelation(models.Model):
    modelc = models.ForeignKey(ModelC)
    modela = models.ForeignKey(ModelA)

class ModelAChild(models.Model):
    parent_model = models.ForeignKey(ModelA)
    active = models.BooleanField(default=True)
    type = model.CharField(choices=['a', 'b', 'c', 'd'])
    updated_at = models.DateTimeField()
  • МодельС связана с МодельюА отношением "многие ко многим",
  • ModelA связана с ModelC через отношение ModelAModelCRelation,
  • ModelAChild связана с ModelA с помощью ForeignKey, у которой есть много записей, связанных с записями ModelA

И соответствующие сериализаторы:

class ModelCSerializer(serializers.ModelSerializer):
    modelA_objects = ModelASerializer(many=True, read_only=False)

    class Meta:
        model = ModelC
        fields = StateBaseSerializer.Meta.fields + [
            "id",
            "name",
            "modelA_objects",
        ]

class ModelASerializer(serializers.ModelSerializer):
    modelAChild_objects = ModelAChildSerializer(many=True, read_only=True)

    class Meta:
        model = ModelA
        fields = (
            'id',
            'state',
            'modelAChild_objects',
        )

class ModelAChildSerializer(serializers.ModelSerializer):
    class Meta:
        model = ModelAChild
        fields = (
            'id',
            'active',
            'type',
        )

При таком подходе результат получается следующим:

[
    {
        'modelC_obj': {
            'id': x,
            'name': 'object name',
            'modelA_obj': [
                {
                    'id': 1, 
                    'state': 'state name',
                    'modelAChild_obj': [
                        {
                            'id': 1,
                            'active': true,
                            'type': 'a'
                        },
                        {
                            'id': 2,
                            'active': false,
                            'type': 'b'
                        },
                        {
                            'id': 3,
                            'active': true,
                            'type': 'd'
                        },
                    ]
                }
            ]
        }
    }
]

Но мне нужен сериализованный результат, например:

[
    {
        'modelC_obj': {
            'id': x,
            'name': 'object name',
            'modelA_obj': [
                {
                    'id': 1, 
                    'state': 'state name',
                    'modelAChild_obj': {
                        'id': 1,
                        'active': true,
                        'type': 'a'
                    }
                }
            ]
        }
    }
]

Я перепробовал множество методов запросов с использованием Case When подхода, используемого в Subquery. Но я не могу сделать так, чтобы получить только одну запись ModelAChild для сериализации. Какой правильный запрос и сериализаторы должны возвращать результат, как указано выше?

Вернуться на верх