В Annotate я пытаюсь получить количество запросов, для которых is_healthy равно True, но получаю сообщение об ошибке The annotation 'id' conflicts with a field on the model.
Любое решение, чтобы решить эту проблему? и почему это вызывает, как я могу это решить?
DeviceHealthHistory.objects.filter(**filter_data).values(
id = F('id'),
).annotate(
healthy_count=Count('id', filter=Q(is_healthy=True)),
)





Если вы просто ищете количество, вы используете функцию count для набора запросов:
DeviceHealthHistory.objects.filter(**filter_data).filter(is_healthy=True).count()
Чтобы получить другие поля вместе со значением count.
DeviceHealthHistory.objects.filter(**filter_data).values(
'other_field1'
).annotate(
healthy_count=Count('id', filter=Q(is_healthy=True)),
)
Мне нужно количество здоровых_устройств как одно из значений вместе с некоторыми другими данными. Вот почему я сделал аннотацию. ваш запрос даст мне только количество записей.
Вам не нужно =F('id'). Вы можете использовать имя поля напрямую. Обратите внимание, что подсчет идентификатора с идентификатором в самом наборе результатов не даст вам правильных результатов. Я предполагаю, что у вас будет другой набор полей в values
Вы должны считать с:
DeviceHealthHistory.objects.filter(**filter_data, is_healthy=True).count()Это отфильтрует по **filter_data, а также обеспечит подсчет записей только с is_healthy=True. Затем мы подсчитываем количество записей.
Если вы хотите «группировать» по определенному полю, например patient_id, вы можете работать с:
DeviceHealthHistory.objects.filter(**filter_data).values('patient_id').annotate(
n=Count('pk', filter=Q(is_healthy=True))
).order_by('patient_id')Это создаст набор запросов словарей с 'patient_id' и 'n' в качестве ключей, а пациента и соответствующие подсчеты в качестве значений.
Пожалуйста, опишите образец набора данных и ожидаемый результат. Непонятно, чего именно вы пытаетесь достичь