Как получить один вложенный дочерний объект в родительском сериализованном объекте, когда модели связаны с внешним ключом?
У меня есть связанные модели, такие как:
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
для сериализации.
Какой правильный запрос и сериализаторы должны возвращать результат, как указано выше?