Аннотирование по отношениям "один-ко-многим" в Django

Допустим, у меня есть две модели

class Test1:
   ...........
class Test2:
    test1 = models.ForeignKey(Test1, related_name = 'tests')
    isCompleted = models.BooleanField()

и я хочу сделать такой запрос

`queryset = Test1.objects.annotate(is_completed = Q(tests__isCompleted = True ))

конечно, это дает мне Не, когда я делаю это

queryset[0].tests.first().is_completed

Я пытаюсь проверить, что только один из связанных объектов tests (связанных объектов Test1) имеет поле isCompleted со значением True. Поэтому мои вопросы заключаются в том, какой правильный способ сделать это

Следующее должно работать.

queryset = Test1.objects.annotate(is_completed = models.F("tests__isCompleted "))

Вы можете отфильтровать это вниз (не уверен, что вам это нужно) :

queryset.filter(is_completed=True)

Или сделать это в одну строку;

queryset = Test1.objects.annotate(is_completed = models.F("tests__isCompleted ")).filter(is_completed=True)

Таким образом, вы все еще можете получить доступ к отдельному значению is_completed.

F-выражения - это здорово, посмотрите на них:

https://docs.djangoproject.com/en/4.1/ref/models/expressions/#query-expressions

Если у вас есть экземпляр Test1 (сохраненный, например, как test1) и вы просто хотите узнать, связан ли этот экземпляр Test2 с isCompleted, вы можете сделать следующее:

Test2.objects.filter(isCompleted=True, test1=test1.id).exists()

Это вернет булево значение, существует ли Test2 с isCompleted = True, связанное с вашим Test1.

Если вы хотите получить все Test1, у которых есть хотя бы один связанный Test2 с isCompleted = True, вы можете сделать:

Test1.objects.filter(tests__isCompleted=True).distinct()
Вернуться на верх