Как получить аннотированное поле с помощью дочерней модели в Django?
У меня проблема с получением поля Annotate в Django(DRF).
Например, есть две модели под названием AA, BB.
class AA(models.Model):
name = models.CharField()
class BB(models.Model):
parent = models.ForeignKey(AA, related_name="BB")
name2 = models.CharField()
Затем я хочу получить список AA, в котором поле аннотации называется status
.
Условием status
является word(provided by client)=name2
Например,
[
{
name: "aaa1",
status: True, // if "aaa1" in AA has the word
},
{
name: "aaa2",
status: False, // if "aaa2" in AA doesn't have the word
}
]
Поэтому я ввел следующий код в файл views.py,
queryset = (AA.objects.prefetch_related("BB").annotate(
status=Case(
When(BB__name2=word, then=Value(True)),
default=Value(False),
output_field=BooleanField()
)
))
но получились следующие результаты. (Если слово "bbb1")
[
{
name: "aaa1",
status: True, // "bbb1" whose parent is "aaa1"
},
{
name: "aaa1",
status: False, // "bbb2" whose parent is "aaa1"
},
{
name: "aaa1",
status: False, // "bbb3" whose parent is "aaa1"
},
{
name: "aaa2",
status: True, // "bbb1" whose parent is "aaa2"
}
]
Я хочу узнать, имеет ли хотя бы одна дочерняя модель (BB) name2
с точки зрения родителя (AA), и она возвращает список всех дочерних моделей.
Что мне делать?
Решено с помощью Exists
и OuterRef
в annotate.
queryset = (AA.objects.annotate(
status=Exists(
BB.objects.filter(parent=OuterRef("id"), name2=word)
)
))