Аннотирование по отношениям "один-ко-многим" в 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()