Установка значения поля annotate из другого связанного дочернего значения
Я хочу добавить дополнительное поле, которое будет содержать значение из второго уровня связанной модели. проблема в том, что первый уровень один ко многим.
пример Модели:
class ModelA(BaseModel):
name=models.CharField()
class ModelB(BaseModel):
type=models.CharField(max_length=100, unique=True) #the value will be one of [x, y, z]
parent = models.ForeignKey('ModelA', related_name='related_models')
class ModelC(BaseModel):
ext = models.CharField(max_length=100, unique=True)
model_b = models.ForeignKey('ModelB', related_name='modelc')
примерные значения моделей
modelA = [
{'id': 1,'name': 'data1'},
{'id': 2,'name': 'data2'},
{'id': 3,'name': 'data3'},
{'id': 4,'name': 'data4'}
]
modelB = [
{'id': 1,'type': 'y', 'parent_id': 1},
{'id': 2,'type': 'z', 'parent_id': 1},
{'id': 3,'type': 'x', 'parent_id': 3},
{'id': 4,'type': 'z', 'parent_id': 3},
{'id': 5,'type': 'z', 'parent_id': 2},
]
modelC = [
{'id': 1, 'ext': 'juststr#1', 'model_b_id': 2},
{'id': 2, 'ext': 'juststr#2', 'model_b_id': 4},
]
ожидаемый результат:
[
{'id': 1,'name': 'data1', 'mc_status': True},
{'id': 2,'name': 'data2', 'mc_status': False},
{'id': 3,'name': 'data3', 'mc_status': True},
{'id': 4,'name': 'data4', 'mc_status': False}
]
Я пробовал:
model_a = model_a.annotate(
mc_status=Case(
When(
Q('related_models__type'='z', 'related_models__modelc__isnull'=False),
then=True
),
default=Value(False),
output_field=BooleanField()
)
)
#wrrong result :(
Я не знаю, правилен ли метод, который я пробую, или нет, но очевидно, что результат неправильный. Я думаю, это потому, что второй уровень отношений между таблицами modelA и modelC не один к одному. если кто-нибудь знает, как это сделать или у кого-нибудь есть ссылка, это было бы очень полезно, спасибо